{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np   \n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy import nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df = pd.ExcelFile('./评论数据集.xlsx').parse('sheet1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "res_df=pd.ExcelFile('./餐厅数据集.xlsx').parse('sheet1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>菜系</th>\n",
       "      <th>星级</th>\n",
       "      <th>人均口味</th>\n",
       "      <th>人均环境</th>\n",
       "      <th>人均服务</th>\n",
       "      <th>人均消费</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>548353</td>\n",
       "      <td>火锅</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.3</td>\n",
       "      <td>7.6</td>\n",
       "      <td>7.6</td>\n",
       "      <td>104.0</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>548458</td>\n",
       "      <td>素菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>6.7</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>52.0</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>548530</td>\n",
       "      <td>汤包</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.1</td>\n",
       "      <td>6.2</td>\n",
       "      <td>6.0</td>\n",
       "      <td>17.0</td>\n",
       "      <td>114.244588</td>\n",
       "      <td>30.575134</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>548639</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.2</td>\n",
       "      <td>6.9</td>\n",
       "      <td>7.0</td>\n",
       "      <td>58.0</td>\n",
       "      <td>114.224310</td>\n",
       "      <td>30.582366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>548708</td>\n",
       "      <td>西餐</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.3</td>\n",
       "      <td>6.9</td>\n",
       "      <td>136.0</td>\n",
       "      <td>114.285576</td>\n",
       "      <td>30.557432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>548786</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.9</td>\n",
       "      <td>8.1</td>\n",
       "      <td>7.9</td>\n",
       "      <td>53.0</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>548818</td>\n",
       "      <td>小吃</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.2</td>\n",
       "      <td>6.6</td>\n",
       "      <td>6.7</td>\n",
       "      <td>40.0</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>548835</td>\n",
       "      <td>包子</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.7</td>\n",
       "      <td>8.1</td>\n",
       "      <td>8.3</td>\n",
       "      <td>7.0</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>548842</td>\n",
       "      <td>烤鱼</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.5</td>\n",
       "      <td>6.5</td>\n",
       "      <td>6.5</td>\n",
       "      <td>42.0</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>548880</td>\n",
       "      <td>馄饨/饺子</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.1</td>\n",
       "      <td>6.8</td>\n",
       "      <td>6.9</td>\n",
       "      <td>14.0</td>\n",
       "      <td>114.270949</td>\n",
       "      <td>30.573321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>548888</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.7</td>\n",
       "      <td>7.7</td>\n",
       "      <td>7.8</td>\n",
       "      <td>67.0</td>\n",
       "      <td>114.276973</td>\n",
       "      <td>30.599978</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>548925</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.3</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.5</td>\n",
       "      <td>69.0</td>\n",
       "      <td>114.280622</td>\n",
       "      <td>30.618722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>548942</td>\n",
       "      <td>烧烤</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.5</td>\n",
       "      <td>7.1</td>\n",
       "      <td>7.3</td>\n",
       "      <td>31.0</td>\n",
       "      <td>114.400379</td>\n",
       "      <td>30.634857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>548945</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.6</td>\n",
       "      <td>6.9</td>\n",
       "      <td>97.0</td>\n",
       "      <td>114.303119</td>\n",
       "      <td>30.590399</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>548963</td>\n",
       "      <td>川菜/家常菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.6</td>\n",
       "      <td>7.1</td>\n",
       "      <td>7.6</td>\n",
       "      <td>56.0</td>\n",
       "      <td>114.301576</td>\n",
       "      <td>30.593720</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>548981</td>\n",
       "      <td>自助餐</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.1</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.1</td>\n",
       "      <td>107.0</td>\n",
       "      <td>114.286826</td>\n",
       "      <td>30.588777</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>549024</td>\n",
       "      <td>家常菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.4</td>\n",
       "      <td>7.7</td>\n",
       "      <td>7.8</td>\n",
       "      <td>46.0</td>\n",
       "      <td>114.294152</td>\n",
       "      <td>30.573808</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>549073</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.5</td>\n",
       "      <td>5.4</td>\n",
       "      <td>6.1</td>\n",
       "      <td>39.0</td>\n",
       "      <td>114.296303</td>\n",
       "      <td>30.581459</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>549092</td>\n",
       "      <td>面包甜点</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.1</td>\n",
       "      <td>47.0</td>\n",
       "      <td>114.400540</td>\n",
       "      <td>30.636590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>549096</td>\n",
       "      <td>日本料理</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.2</td>\n",
       "      <td>7.9</td>\n",
       "      <td>7.6</td>\n",
       "      <td>142.0</td>\n",
       "      <td>114.284802</td>\n",
       "      <td>30.583349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>549201</td>\n",
       "      <td>火锅</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.0</td>\n",
       "      <td>63.0</td>\n",
       "      <td>114.271668</td>\n",
       "      <td>30.600359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>549285</td>\n",
       "      <td>烧烤</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.3</td>\n",
       "      <td>6.8</td>\n",
       "      <td>6.8</td>\n",
       "      <td>43.0</td>\n",
       "      <td>114.293937</td>\n",
       "      <td>30.582347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>549301</td>\n",
       "      <td>湘菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.8</td>\n",
       "      <td>8.6</td>\n",
       "      <td>8.7</td>\n",
       "      <td>167.0</td>\n",
       "      <td>114.262408</td>\n",
       "      <td>30.600762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>549319</td>\n",
       "      <td>面包甜点</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.2</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.1</td>\n",
       "      <td>15.0</td>\n",
       "      <td>114.263314</td>\n",
       "      <td>30.549782</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>549431</td>\n",
       "      <td>粤菜馆</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.2</td>\n",
       "      <td>6.7</td>\n",
       "      <td>6.9</td>\n",
       "      <td>92.0</td>\n",
       "      <td>114.316570</td>\n",
       "      <td>30.609480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>549459</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.3</td>\n",
       "      <td>9.1</td>\n",
       "      <td>9.1</td>\n",
       "      <td>527.0</td>\n",
       "      <td>114.302857</td>\n",
       "      <td>30.588293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>549463</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.9</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.3</td>\n",
       "      <td>78.0</td>\n",
       "      <td>114.269486</td>\n",
       "      <td>30.592925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>549485</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.2</td>\n",
       "      <td>7.4</td>\n",
       "      <td>7.4</td>\n",
       "      <td>73.0</td>\n",
       "      <td>114.367442</td>\n",
       "      <td>30.620062</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>549614</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.2</td>\n",
       "      <td>7.3</td>\n",
       "      <td>7.1</td>\n",
       "      <td>79.0</td>\n",
       "      <td>114.269887</td>\n",
       "      <td>30.550032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>549696</td>\n",
       "      <td>西式简餐</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.6</td>\n",
       "      <td>7.1</td>\n",
       "      <td>6.8</td>\n",
       "      <td>41.0</td>\n",
       "      <td>114.298640</td>\n",
       "      <td>30.543976</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1933</th>\n",
       "      <td>73598625</td>\n",
       "      <td>湘菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.5</td>\n",
       "      <td>55.0</td>\n",
       "      <td>114.204537</td>\n",
       "      <td>30.502342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1934</th>\n",
       "      <td>73605347</td>\n",
       "      <td>私房菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.6</td>\n",
       "      <td>7.7</td>\n",
       "      <td>7.1</td>\n",
       "      <td>80.0</td>\n",
       "      <td>114.201842</td>\n",
       "      <td>30.631156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1935</th>\n",
       "      <td>73619687</td>\n",
       "      <td>其他中餐</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>7.5</td>\n",
       "      <td>84.0</td>\n",
       "      <td>114.324633</td>\n",
       "      <td>30.575230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1936</th>\n",
       "      <td>73737468</td>\n",
       "      <td>四川火锅</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.7</td>\n",
       "      <td>8.8</td>\n",
       "      <td>8.9</td>\n",
       "      <td>62.0</td>\n",
       "      <td>114.269010</td>\n",
       "      <td>30.611808</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1937</th>\n",
       "      <td>74068958</td>\n",
       "      <td>烧烤</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.7</td>\n",
       "      <td>7.9</td>\n",
       "      <td>69.0</td>\n",
       "      <td>114.297843</td>\n",
       "      <td>30.647655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1938</th>\n",
       "      <td>74440953</td>\n",
       "      <td>烧烤</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.5</td>\n",
       "      <td>7.9</td>\n",
       "      <td>7.6</td>\n",
       "      <td>61.0</td>\n",
       "      <td>114.324240</td>\n",
       "      <td>30.574233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1939</th>\n",
       "      <td>74574785</td>\n",
       "      <td>四川火锅</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.7</td>\n",
       "      <td>8.9</td>\n",
       "      <td>8.7</td>\n",
       "      <td>93.0</td>\n",
       "      <td>114.308250</td>\n",
       "      <td>30.609190</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1940</th>\n",
       "      <td>74615443</td>\n",
       "      <td>火锅</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.9</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.9</td>\n",
       "      <td>86.0</td>\n",
       "      <td>114.377304</td>\n",
       "      <td>30.626756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1941</th>\n",
       "      <td>74617940</td>\n",
       "      <td>鱼火锅</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.5</td>\n",
       "      <td>7.9</td>\n",
       "      <td>8.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>114.210357</td>\n",
       "      <td>30.561317</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1942</th>\n",
       "      <td>75114301</td>\n",
       "      <td>火锅</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.9</td>\n",
       "      <td>9.1</td>\n",
       "      <td>63.0</td>\n",
       "      <td>114.288500</td>\n",
       "      <td>30.575920</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1943</th>\n",
       "      <td>75132934</td>\n",
       "      <td>香锅</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.3</td>\n",
       "      <td>8.7</td>\n",
       "      <td>9.0</td>\n",
       "      <td>52.0</td>\n",
       "      <td>114.207730</td>\n",
       "      <td>30.559030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1944</th>\n",
       "      <td>75136440</td>\n",
       "      <td>快餐简餐</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.2</td>\n",
       "      <td>23.0</td>\n",
       "      <td>114.387068</td>\n",
       "      <td>30.478409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1945</th>\n",
       "      <td>75143967</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.5</td>\n",
       "      <td>7.9</td>\n",
       "      <td>98.0</td>\n",
       "      <td>114.220600</td>\n",
       "      <td>30.598030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1946</th>\n",
       "      <td>75146297</td>\n",
       "      <td>湘菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.2</td>\n",
       "      <td>8.7</td>\n",
       "      <td>8.5</td>\n",
       "      <td>64.0</td>\n",
       "      <td>114.404983</td>\n",
       "      <td>30.623222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1947</th>\n",
       "      <td>75158449</td>\n",
       "      <td>西餐</td>\n",
       "      <td>5.0</td>\n",
       "      <td>8.7</td>\n",
       "      <td>9.1</td>\n",
       "      <td>9.2</td>\n",
       "      <td>87.0</td>\n",
       "      <td>114.336598</td>\n",
       "      <td>30.516513</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1948</th>\n",
       "      <td>75184983</td>\n",
       "      <td>火锅</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.8</td>\n",
       "      <td>7.8</td>\n",
       "      <td>89.0</td>\n",
       "      <td>114.207730</td>\n",
       "      <td>30.559030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1949</th>\n",
       "      <td>75191536</td>\n",
       "      <td>火锅</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.7</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.6</td>\n",
       "      <td>110.0</td>\n",
       "      <td>114.298432</td>\n",
       "      <td>30.594948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1950</th>\n",
       "      <td>75237451</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.5</td>\n",
       "      <td>8.7</td>\n",
       "      <td>8.6</td>\n",
       "      <td>198.0</td>\n",
       "      <td>114.490670</td>\n",
       "      <td>30.550950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1951</th>\n",
       "      <td>75335224</td>\n",
       "      <td>甜品饮品</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.3</td>\n",
       "      <td>8.5</td>\n",
       "      <td>8.1</td>\n",
       "      <td>23.0</td>\n",
       "      <td>114.355646</td>\n",
       "      <td>30.525417</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1952</th>\n",
       "      <td>75633851</td>\n",
       "      <td>日本料理</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.4</td>\n",
       "      <td>8.2</td>\n",
       "      <td>8.0</td>\n",
       "      <td>105.0</td>\n",
       "      <td>114.286900</td>\n",
       "      <td>30.583530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1953</th>\n",
       "      <td>75640890</td>\n",
       "      <td>东南亚菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.7</td>\n",
       "      <td>8.3</td>\n",
       "      <td>7.7</td>\n",
       "      <td>75.0</td>\n",
       "      <td>114.316285</td>\n",
       "      <td>30.551991</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1954</th>\n",
       "      <td>76080256</td>\n",
       "      <td>火锅</td>\n",
       "      <td>5.0</td>\n",
       "      <td>9.1</td>\n",
       "      <td>8.9</td>\n",
       "      <td>9.1</td>\n",
       "      <td>81.0</td>\n",
       "      <td>114.218890</td>\n",
       "      <td>30.606327</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1955</th>\n",
       "      <td>76087768</td>\n",
       "      <td>韩国料理</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.6</td>\n",
       "      <td>8.5</td>\n",
       "      <td>8.4</td>\n",
       "      <td>70.0</td>\n",
       "      <td>114.300181</td>\n",
       "      <td>30.589460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1956</th>\n",
       "      <td>76319040</td>\n",
       "      <td>湘菜</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.8</td>\n",
       "      <td>8.0</td>\n",
       "      <td>71.0</td>\n",
       "      <td>114.331537</td>\n",
       "      <td>30.536309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1957</th>\n",
       "      <td>76356120</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "      <td>3.5</td>\n",
       "      <td>7.6</td>\n",
       "      <td>8.1</td>\n",
       "      <td>7.5</td>\n",
       "      <td>62.0</td>\n",
       "      <td>114.207730</td>\n",
       "      <td>30.559030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1958</th>\n",
       "      <td>76669371</td>\n",
       "      <td>西式简餐</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.1</td>\n",
       "      <td>8.4</td>\n",
       "      <td>8.1</td>\n",
       "      <td>45.0</td>\n",
       "      <td>114.316200</td>\n",
       "      <td>30.551820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1959</th>\n",
       "      <td>76685062</td>\n",
       "      <td>西餐</td>\n",
       "      <td>4.0</td>\n",
       "      <td>8.5</td>\n",
       "      <td>8.5</td>\n",
       "      <td>8.1</td>\n",
       "      <td>73.0</td>\n",
       "      <td>114.167996</td>\n",
       "      <td>30.617089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1960</th>\n",
       "      <td>76715058</td>\n",
       "      <td>咖啡厅</td>\n",
       "      <td>3.5</td>\n",
       "      <td>8.2</td>\n",
       "      <td>8.5</td>\n",
       "      <td>7.5</td>\n",
       "      <td>50.0</td>\n",
       "      <td>114.311663</td>\n",
       "      <td>30.607016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1961</th>\n",
       "      <td>76734324</td>\n",
       "      <td>西式正餐</td>\n",
       "      <td>4.5</td>\n",
       "      <td>8.2</td>\n",
       "      <td>8.9</td>\n",
       "      <td>8.5</td>\n",
       "      <td>78.0</td>\n",
       "      <td>114.205485</td>\n",
       "      <td>30.552435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1962</th>\n",
       "      <td>76759281</td>\n",
       "      <td>烧烤</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7.8</td>\n",
       "      <td>8.3</td>\n",
       "      <td>8.3</td>\n",
       "      <td>72.0</td>\n",
       "      <td>114.290802</td>\n",
       "      <td>30.638772</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1963 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            id       菜系   星级  人均口味  人均环境  人均服务   人均消费          经度         纬度\n",
       "0       548353       火锅  4.0   8.3   7.6   7.6  104.0  114.298401  30.578830\n",
       "1       548458       素菜  3.5   6.7   7.0   7.0   52.0  114.260987  30.544928\n",
       "2       548530       汤包  3.5   7.1   6.2   6.0   17.0  114.244588  30.575134\n",
       "3       548639  湖北菜/家常菜  3.5   7.2   6.9   7.0   58.0  114.224310  30.582366\n",
       "4       548708       西餐  3.5   7.0   7.3   6.9  136.0  114.285576  30.557432\n",
       "5       548786  湖北菜/家常菜  4.0   7.9   8.1   7.9   53.0  114.372597  30.621815\n",
       "6       548818       小吃  3.5   7.2   6.6   6.7   40.0  114.336223  30.658225\n",
       "7       548835       包子  4.5   8.7   8.1   8.3    7.0  114.291923  30.604506\n",
       "8       548842       烤鱼  4.0   7.5   6.5   6.5   42.0  114.297598  30.548626\n",
       "9       548880    馄饨/饺子  3.5   7.1   6.8   6.9   14.0  114.270949  30.573321\n",
       "10      548888  湖北菜/家常菜  4.0   7.7   7.7   7.8   67.0  114.276973  30.599978\n",
       "11      548925  湖北菜/家常菜  4.0   8.3   7.8   7.5   69.0  114.280622  30.618722\n",
       "12      548942       烧烤  4.0   7.5   7.1   7.3   31.0  114.400379  30.634857\n",
       "13      548945  湖北菜/家常菜  3.5   7.4   7.6   6.9   97.0  114.303119  30.590399\n",
       "14      548963   川菜/家常菜  4.5   8.6   7.1   7.6   56.0  114.301576  30.593720\n",
       "15      548981      自助餐  3.5   7.1   7.4   7.1  107.0  114.286826  30.588777\n",
       "16      549024      家常菜  4.5   8.4   7.7   7.8   46.0  114.294152  30.573808\n",
       "17      549073  湖北菜/家常菜  4.0   7.5   5.4   6.1   39.0  114.296303  30.581459\n",
       "18      549092     面包甜点  3.5   7.4   7.4   7.1   47.0  114.400540  30.636590\n",
       "19      549096     日本料理  4.0   8.2   7.9   7.6  142.0  114.284802  30.583349\n",
       "20      549201       火锅  4.0   7.8   7.4   7.0   63.0  114.271668  30.600359\n",
       "21      549285       烧烤  4.0   7.3   6.8   6.8   43.0  114.293937  30.582347\n",
       "22      549301       湘菜  4.5   8.8   8.6   8.7  167.0  114.262408  30.600762\n",
       "23      549319     面包甜点  4.5   8.2   8.4   8.1   15.0  114.263314  30.549782\n",
       "24      549431      粤菜馆  3.5   7.2   6.7   6.9   92.0  114.316570  30.609480\n",
       "25      549459  湖北菜/家常菜  4.5   8.3   9.1   9.1  527.0  114.302857  30.588293\n",
       "26      549463  湖北菜/家常菜  4.5   8.9   8.4   8.3   78.0  114.269486  30.592925\n",
       "27      549485  湖北菜/家常菜  3.5   7.2   7.4   7.4   73.0  114.367442  30.620062\n",
       "28      549614  湖北菜/家常菜  3.5   7.2   7.3   7.1   79.0  114.269887  30.550032\n",
       "29      549696     西式简餐  4.0   7.6   7.1   6.8   41.0  114.298640  30.543976\n",
       "...        ...      ...  ...   ...   ...   ...    ...         ...        ...\n",
       "1933  73598625       湘菜  3.5   7.0   7.8   7.5   55.0  114.204537  30.502342\n",
       "1934  73605347      私房菜  3.5   7.6   7.7   7.1   80.0  114.201842  30.631156\n",
       "1935  73619687     其他中餐  4.0   8.0   8.0   7.5   84.0  114.324633  30.575230\n",
       "1936  73737468     四川火锅  4.5   8.7   8.8   8.9   62.0  114.269010  30.611808\n",
       "1937  74068958       烧烤  4.0   7.8   7.7   7.9   69.0  114.297843  30.647655\n",
       "1938  74440953       烧烤  4.0   7.5   7.9   7.6   61.0  114.324240  30.574233\n",
       "1939  74574785     四川火锅  4.5   8.7   8.9   8.7   93.0  114.308250  30.609190\n",
       "1940  74615443       火锅  3.5   7.9   7.8   7.9   86.0  114.377304  30.626756\n",
       "1941  74617940      鱼火锅  3.5   7.5   7.9   8.0   72.0  114.210357  30.561317\n",
       "1942  75114301       火锅  4.5   8.4   8.9   9.1   63.0  114.288500  30.575920\n",
       "1943  75132934       香锅  4.5   8.3   8.7   9.0   52.0  114.207730  30.559030\n",
       "1944  75136440     快餐简餐  4.0   8.4   8.4   8.2   23.0  114.387068  30.478409\n",
       "1945  75143967  湖北菜/家常菜  4.0   8.0   8.5   7.9   98.0  114.220600  30.598030\n",
       "1946  75146297       湘菜  4.0   8.2   8.7   8.5   64.0  114.404983  30.623222\n",
       "1947  75158449       西餐  5.0   8.7   9.1   9.2   87.0  114.336598  30.516513\n",
       "1948  75184983       火锅  4.0   7.8   7.8   7.8   89.0  114.207730  30.559030\n",
       "1949  75191536       火锅  4.5   8.7   9.0   8.6  110.0  114.298432  30.594948\n",
       "1950  75237451  湖北菜/家常菜  4.5   8.5   8.7   8.6  198.0  114.490670  30.550950\n",
       "1951  75335224     甜品饮品  4.0   8.3   8.5   8.1   23.0  114.355646  30.525417\n",
       "1952  75633851     日本料理  3.5   7.4   8.2   8.0  105.0  114.286900  30.583530\n",
       "1953  75640890     东南亚菜  4.0   7.7   8.3   7.7   75.0  114.316285  30.551991\n",
       "1954  76080256       火锅  5.0   9.1   8.9   9.1   81.0  114.218890  30.606327\n",
       "1955  76087768     韩国料理  4.5   8.6   8.5   8.4   70.0  114.300181  30.589460\n",
       "1956  76319040       湘菜  4.0   8.0   8.8   8.0   71.0  114.331537  30.536309\n",
       "1957  76356120  湖北菜/家常菜  3.5   7.6   8.1   7.5   62.0  114.207730  30.559030\n",
       "1958  76669371     西式简餐  4.0   8.1   8.4   8.1   45.0  114.316200  30.551820\n",
       "1959  76685062       西餐  4.0   8.5   8.5   8.1   73.0  114.167996  30.617089\n",
       "1960  76715058      咖啡厅  3.5   8.2   8.5   7.5   50.0  114.311663  30.607016\n",
       "1961  76734324     西式正餐  4.5   8.2   8.9   8.5   78.0  114.205485  30.552435\n",
       "1962  76759281       烧烤  4.0   7.8   8.3   8.3   72.0  114.290802  30.638772\n",
       "\n",
       "[1963 rows x 9 columns]"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户id</th>\n",
       "      <th>id</th>\n",
       "      <th>总分</th>\n",
       "      <th>口味</th>\n",
       "      <th>环境</th>\n",
       "      <th>服务</th>\n",
       "      <th>消费</th>\n",
       "      <th>评论时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>菜系</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>54984014</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20439699</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>51346015</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10590231</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28573029</td>\n",
       "      <td>548353</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1212420781</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>28016604</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>36132872</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>130.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>48447397</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>114570266</td>\n",
       "      <td>548353</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>8321276</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>19</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>631463718</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>10604745</td>\n",
       "      <td>548373</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>40434994</td>\n",
       "      <td>548373</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>13524592</td>\n",
       "      <td>548373</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>802687816</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>90349827</td>\n",
       "      <td>548373</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>31576559</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>848650581</td>\n",
       "      <td>548458</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>833721460</td>\n",
       "      <td>548458</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>90349827</td>\n",
       "      <td>548458</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>47048946</td>\n",
       "      <td>548512</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>18264607</td>\n",
       "      <td>548512</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>836397020</td>\n",
       "      <td>548512</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>135686523</td>\n",
       "      <td>548512</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>1271268684</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>86872257</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>177637147</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>1163278107</td>\n",
       "      <td>548530</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.244588</td>\n",
       "      <td>30.575134</td>\n",
       "      <td>汤包</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>580003129</td>\n",
       "      <td>548530</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.244588</td>\n",
       "      <td>30.575134</td>\n",
       "      <td>汤包</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38889</th>\n",
       "      <td>18494906</td>\n",
       "      <td>98704383</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.268695</td>\n",
       "      <td>30.610074</td>\n",
       "      <td>川菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38890</th>\n",
       "      <td>857959952</td>\n",
       "      <td>98711181</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38891</th>\n",
       "      <td>721091356</td>\n",
       "      <td>98711181</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38892</th>\n",
       "      <td>33529960</td>\n",
       "      <td>98711181</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38893</th>\n",
       "      <td>1292938</td>\n",
       "      <td>98711181</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38894</th>\n",
       "      <td>14429811</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38895</th>\n",
       "      <td>140134019</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38896</th>\n",
       "      <td>13458975</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38897</th>\n",
       "      <td>1339879100</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38898</th>\n",
       "      <td>38619572</td>\n",
       "      <td>98741019</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38899</th>\n",
       "      <td>39575780</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38900</th>\n",
       "      <td>25847575</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38901</th>\n",
       "      <td>26143336</td>\n",
       "      <td>98741019</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38902</th>\n",
       "      <td>3681693</td>\n",
       "      <td>98744031</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.248790</td>\n",
       "      <td>30.632296</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38903</th>\n",
       "      <td>818102587</td>\n",
       "      <td>98744031</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.248790</td>\n",
       "      <td>30.632296</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38904</th>\n",
       "      <td>827569443</td>\n",
       "      <td>98768709</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>21</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38905</th>\n",
       "      <td>15560334</td>\n",
       "      <td>98768709</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>21</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38906</th>\n",
       "      <td>38835704</td>\n",
       "      <td>98768709</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38907</th>\n",
       "      <td>110769221</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38908</th>\n",
       "      <td>21119410</td>\n",
       "      <td>98776222</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38909</th>\n",
       "      <td>39188392</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38910</th>\n",
       "      <td>75416942</td>\n",
       "      <td>98776222</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>15</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38911</th>\n",
       "      <td>25600629</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38912</th>\n",
       "      <td>130131274</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38913</th>\n",
       "      <td>57597185</td>\n",
       "      <td>98779405</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38914</th>\n",
       "      <td>10511471</td>\n",
       "      <td>98779405</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38915</th>\n",
       "      <td>1202776129</td>\n",
       "      <td>98779405</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38916</th>\n",
       "      <td>3081272</td>\n",
       "      <td>98785465</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>19</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38917</th>\n",
       "      <td>1053104032</td>\n",
       "      <td>98785465</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38918</th>\n",
       "      <td>25139936</td>\n",
       "      <td>98785465</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>38919 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             用户id        id  总分   口味   环境   服务     消费  评论时间          经度  \\\n",
       "0        54984014    548353   5  5.0  5.0  5.0    0.0    18  114.298401   \n",
       "1        20439699    548353   5  5.0  4.0  5.0    0.0    18  114.298401   \n",
       "2        51346015    548353   5  5.0  5.0  5.0  100.0    10  114.298401   \n",
       "3        10590231    548353   5  5.0  5.0  5.0  100.0    16  114.298401   \n",
       "4        28573029    548353   3  4.0  3.0  3.0    0.0    13  114.298401   \n",
       "5      1212420781    548353   4  4.0  4.0  4.0    0.0    14  114.298401   \n",
       "6        28016604    548353   5  5.0  5.0  5.0    0.0    10  114.298401   \n",
       "7        36132872    548353   4  5.0  5.0  3.0  130.0     9  114.298401   \n",
       "8        48447397    548353   4  5.0  4.0  4.0    0.0     0  114.298401   \n",
       "9       114570266    548353   3  3.0  3.0  3.0    0.0    19  114.298401   \n",
       "10        8321276    548373   5  5.0  5.0  5.0    NaN    19  114.321180   \n",
       "11      631463718    548373   5  5.0  5.0  5.0    0.0    10  114.321180   \n",
       "12       10604745    548373   4  4.0  4.0  4.0   20.0    22  114.321180   \n",
       "13       40434994    548373   3  3.0  3.0  4.0    0.0    18  114.321180   \n",
       "14       13524592    548373   3  3.0  3.0  3.0    0.0    23  114.321180   \n",
       "15      802687816    548373   5  5.0  5.0  5.0    0.0    18  114.321180   \n",
       "16       90349827    548373   4  4.0  4.0  4.0    0.0    21  114.321180   \n",
       "17       31576559    548373   5  4.0  4.0  4.0    0.0    17  114.321180   \n",
       "18      848650581    548458   5  5.0  5.0  5.0    NaN    20  114.260987   \n",
       "19      833721460    548458   4  3.0  3.0  3.0    0.0     8  114.260987   \n",
       "20       90349827    548458   3  4.0  3.0  3.0    0.0    22  114.260987   \n",
       "21       47048946    548512   3  3.0  4.0  4.0    0.0    11  114.342934   \n",
       "22       18264607    548512   4  4.0  5.0  5.0    0.0     1  114.342934   \n",
       "23      836397020    548512   4  4.0  4.0  4.0  100.0     7  114.342934   \n",
       "24      135686523    548512   3  3.0  3.0  3.0    0.0    20  114.342934   \n",
       "25     1271268684    548512   5  5.0  5.0  5.0    0.0    21  114.342934   \n",
       "26       86872257    548512   5  5.0  4.0  5.0    0.0    11  114.342934   \n",
       "27      177637147    548512   5  5.0  5.0  5.0    0.0     6  114.342934   \n",
       "28     1163278107    548530   4  4.0  3.0  3.0    0.0    20  114.244588   \n",
       "29      580003129    548530   4  5.0  4.0  4.0    0.0    14  114.244588   \n",
       "...           ...       ...  ..  ...  ...  ...    ...   ...         ...   \n",
       "38889    18494906  98704383   4  4.0  4.0  3.0    0.0     8  114.268695   \n",
       "38890   857959952  98711181   4  5.0  4.0  4.0   25.0    18  114.144302   \n",
       "38891   721091356  98711181   5  5.0  5.0  5.0    0.0    18  114.144302   \n",
       "38892    33529960  98711181   4  4.0  4.0  4.0    0.0    11  114.144302   \n",
       "38893     1292938  98711181   3  4.0  4.0  3.0    0.0    20  114.144302   \n",
       "38894    14429811  98723987   5  5.0  4.0  4.0    0.0    20  114.314525   \n",
       "38895   140134019  98723987   5  5.0  4.0  5.0    0.0    14  114.314525   \n",
       "38896    13458975  98723987   5  5.0  5.0  4.0    0.0     9  114.314525   \n",
       "38897  1339879100  98741019   4  4.0  4.0  2.0  100.0    16  114.277901   \n",
       "38898    38619572  98741019   5  5.0  4.0  5.0    0.0    12  114.277901   \n",
       "38899    39575780  98741019   4  4.0  4.0  4.0    0.0     7  114.277901   \n",
       "38900    25847575  98741019   4  4.0  4.0  4.0    0.0     0  114.277901   \n",
       "38901    26143336  98741019   5  5.0  5.0  5.0    0.0    17  114.277901   \n",
       "38902     3681693  98744031   3  3.0  2.0  3.0    0.0    22  114.248790   \n",
       "38903   818102587  98744031   4  4.0  4.0  5.0   40.0    19  114.248790   \n",
       "38904   827569443  98768709   5  5.0  5.0  5.0    NaN    21  114.220962   \n",
       "38905    15560334  98768709   4  4.0  4.0  4.0    NaN    21  114.220962   \n",
       "38906    38835704  98768709   5  5.0  5.0  5.0    0.0    13  114.220962   \n",
       "38907   110769221  98776222   5  5.0  5.0  5.0    0.0    23  114.302148   \n",
       "38908    21119410  98776222   4  4.0  4.0  4.0  100.0    23  114.302148   \n",
       "38909    39188392  98776222   5  5.0  5.0  5.0  100.0    20  114.302148   \n",
       "38910    75416942  98776222   4  3.0  4.0  4.0    0.0    15  114.302148   \n",
       "38911    25600629  98776222   5  5.0  4.0  4.0    0.0    12  114.302148   \n",
       "38912   130131274  98776222   5  5.0  5.0  5.0    0.0    16  114.302148   \n",
       "38913    57597185  98779405   5  5.0  5.0  5.0    0.0    22  114.256547   \n",
       "38914    10511471  98779405   4  3.0  4.0  5.0    0.0    17  114.256547   \n",
       "38915  1202776129  98779405   4  3.0  4.0  3.0    0.0    22  114.256547   \n",
       "38916     3081272  98785465   3  3.0  3.0  3.0    NaN    19  114.332129   \n",
       "38917  1053104032  98785465   5  5.0  5.0  5.0    0.0    17  114.332129   \n",
       "38918    25139936  98785465   3  3.0  3.0  3.0    0.0     8  114.332129   \n",
       "\n",
       "              纬度       菜系  \n",
       "0      30.578830       火锅  \n",
       "1      30.578830       火锅  \n",
       "2      30.578830       火锅  \n",
       "3      30.578830       火锅  \n",
       "4      30.578830       火锅  \n",
       "5      30.578830       火锅  \n",
       "6      30.578830       火锅  \n",
       "7      30.578830       火锅  \n",
       "8      30.578830       火锅  \n",
       "9      30.578830       火锅  \n",
       "10     30.539450       素菜  \n",
       "11     30.539450       素菜  \n",
       "12     30.539450       素菜  \n",
       "13     30.539450       素菜  \n",
       "14     30.539450       素菜  \n",
       "15     30.539450       素菜  \n",
       "16     30.539450       素菜  \n",
       "17     30.539450       素菜  \n",
       "18     30.544928       素菜  \n",
       "19     30.544928       素菜  \n",
       "20     30.544928       素菜  \n",
       "21     30.538502  湖北菜/家常菜  \n",
       "22     30.538502  湖北菜/家常菜  \n",
       "23     30.538502  湖北菜/家常菜  \n",
       "24     30.538502  湖北菜/家常菜  \n",
       "25     30.538502  湖北菜/家常菜  \n",
       "26     30.538502  湖北菜/家常菜  \n",
       "27     30.538502  湖北菜/家常菜  \n",
       "28     30.575134       汤包  \n",
       "29     30.575134       汤包  \n",
       "...          ...      ...  \n",
       "38889  30.610074       川菜  \n",
       "38890  30.622604     面包甜点  \n",
       "38891  30.622604     面包甜点  \n",
       "38892  30.622604     面包甜点  \n",
       "38893  30.622604     面包甜点  \n",
       "38894  30.509828      小龙虾  \n",
       "38895  30.509828      小龙虾  \n",
       "38896  30.509828      小龙虾  \n",
       "38897  30.598616      粤菜馆  \n",
       "38898  30.598616      粤菜馆  \n",
       "38899  30.598616      粤菜馆  \n",
       "38900  30.598616      粤菜馆  \n",
       "38901  30.598616      粤菜馆  \n",
       "38902  30.632296       烧烤  \n",
       "38903  30.632296       烧烤  \n",
       "38904  30.563103       火锅  \n",
       "38905  30.563103       火锅  \n",
       "38906  30.563103       火锅  \n",
       "38907  30.555387       湘菜  \n",
       "38908  30.555387       湘菜  \n",
       "38909  30.555387       湘菜  \n",
       "38910  30.555387       湘菜  \n",
       "38911  30.555387       湘菜  \n",
       "38912  30.555387       湘菜  \n",
       "38913  30.536278     四川火锅  \n",
       "38914  30.536278     四川火锅  \n",
       "38915  30.536278     四川火锅  \n",
       "38916  30.536633       小吃  \n",
       "38917  30.536633       小吃  \n",
       "38918  30.536633       小吃  \n",
       "\n",
       "[38919 rows x 11 columns]"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df.fillna(0,inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户id</th>\n",
       "      <th>id</th>\n",
       "      <th>总分</th>\n",
       "      <th>口味</th>\n",
       "      <th>环境</th>\n",
       "      <th>服务</th>\n",
       "      <th>消费</th>\n",
       "      <th>评论时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>菜系</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>54984014</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20439699</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>51346015</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10590231</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28573029</td>\n",
       "      <td>548353</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1212420781</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>28016604</td>\n",
       "      <td>548353</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>36132872</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>130.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>48447397</td>\n",
       "      <td>548353</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>114570266</td>\n",
       "      <td>548353</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.298401</td>\n",
       "      <td>30.578830</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>8321276</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>631463718</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>10604745</td>\n",
       "      <td>548373</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>40434994</td>\n",
       "      <td>548373</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>13524592</td>\n",
       "      <td>548373</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>802687816</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>90349827</td>\n",
       "      <td>548373</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>31576559</td>\n",
       "      <td>548373</td>\n",
       "      <td>5</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.321180</td>\n",
       "      <td>30.539450</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>848650581</td>\n",
       "      <td>548458</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>833721460</td>\n",
       "      <td>548458</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>90349827</td>\n",
       "      <td>548458</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.260987</td>\n",
       "      <td>30.544928</td>\n",
       "      <td>素菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>47048946</td>\n",
       "      <td>548512</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>18264607</td>\n",
       "      <td>548512</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>836397020</td>\n",
       "      <td>548512</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>135686523</td>\n",
       "      <td>548512</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>1271268684</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>86872257</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>177637147</td>\n",
       "      <td>548512</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>114.342934</td>\n",
       "      <td>30.538502</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>1163278107</td>\n",
       "      <td>548530</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.244588</td>\n",
       "      <td>30.575134</td>\n",
       "      <td>汤包</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>580003129</td>\n",
       "      <td>548530</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.244588</td>\n",
       "      <td>30.575134</td>\n",
       "      <td>汤包</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38889</th>\n",
       "      <td>18494906</td>\n",
       "      <td>98704383</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.268695</td>\n",
       "      <td>30.610074</td>\n",
       "      <td>川菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38890</th>\n",
       "      <td>857959952</td>\n",
       "      <td>98711181</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38891</th>\n",
       "      <td>721091356</td>\n",
       "      <td>98711181</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38892</th>\n",
       "      <td>33529960</td>\n",
       "      <td>98711181</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38893</th>\n",
       "      <td>1292938</td>\n",
       "      <td>98711181</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.144302</td>\n",
       "      <td>30.622604</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38894</th>\n",
       "      <td>14429811</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38895</th>\n",
       "      <td>140134019</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38896</th>\n",
       "      <td>13458975</td>\n",
       "      <td>98723987</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.314525</td>\n",
       "      <td>30.509828</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38897</th>\n",
       "      <td>1339879100</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38898</th>\n",
       "      <td>38619572</td>\n",
       "      <td>98741019</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38899</th>\n",
       "      <td>39575780</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38900</th>\n",
       "      <td>25847575</td>\n",
       "      <td>98741019</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38901</th>\n",
       "      <td>26143336</td>\n",
       "      <td>98741019</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.277901</td>\n",
       "      <td>30.598616</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38902</th>\n",
       "      <td>3681693</td>\n",
       "      <td>98744031</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.248790</td>\n",
       "      <td>30.632296</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38903</th>\n",
       "      <td>818102587</td>\n",
       "      <td>98744031</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.248790</td>\n",
       "      <td>30.632296</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38904</th>\n",
       "      <td>827569443</td>\n",
       "      <td>98768709</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38905</th>\n",
       "      <td>15560334</td>\n",
       "      <td>98768709</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38906</th>\n",
       "      <td>38835704</td>\n",
       "      <td>98768709</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13</td>\n",
       "      <td>114.220962</td>\n",
       "      <td>30.563103</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38907</th>\n",
       "      <td>110769221</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38908</th>\n",
       "      <td>21119410</td>\n",
       "      <td>98776222</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38909</th>\n",
       "      <td>39188392</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38910</th>\n",
       "      <td>75416942</td>\n",
       "      <td>98776222</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>15</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38911</th>\n",
       "      <td>25600629</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38912</th>\n",
       "      <td>130131274</td>\n",
       "      <td>98776222</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.302148</td>\n",
       "      <td>30.555387</td>\n",
       "      <td>湘菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38913</th>\n",
       "      <td>57597185</td>\n",
       "      <td>98779405</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38914</th>\n",
       "      <td>10511471</td>\n",
       "      <td>98779405</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38915</th>\n",
       "      <td>1202776129</td>\n",
       "      <td>98779405</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.256547</td>\n",
       "      <td>30.536278</td>\n",
       "      <td>四川火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38916</th>\n",
       "      <td>3081272</td>\n",
       "      <td>98785465</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38917</th>\n",
       "      <td>1053104032</td>\n",
       "      <td>98785465</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38918</th>\n",
       "      <td>25139936</td>\n",
       "      <td>98785465</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.332129</td>\n",
       "      <td>30.536633</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>38919 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             用户id        id  总分   口味   环境   服务     消费  评论时间          经度  \\\n",
       "0        54984014    548353   5  5.0  5.0  5.0    0.0    18  114.298401   \n",
       "1        20439699    548353   5  5.0  4.0  5.0    0.0    18  114.298401   \n",
       "2        51346015    548353   5  5.0  5.0  5.0  100.0    10  114.298401   \n",
       "3        10590231    548353   5  5.0  5.0  5.0  100.0    16  114.298401   \n",
       "4        28573029    548353   3  4.0  3.0  3.0    0.0    13  114.298401   \n",
       "5      1212420781    548353   4  4.0  4.0  4.0    0.0    14  114.298401   \n",
       "6        28016604    548353   5  5.0  5.0  5.0    0.0    10  114.298401   \n",
       "7        36132872    548353   4  5.0  5.0  3.0  130.0     9  114.298401   \n",
       "8        48447397    548353   4  5.0  4.0  4.0    0.0     0  114.298401   \n",
       "9       114570266    548353   3  3.0  3.0  3.0    0.0    19  114.298401   \n",
       "10        8321276    548373   5  5.0  5.0  5.0    0.0    19  114.321180   \n",
       "11      631463718    548373   5  5.0  5.0  5.0    0.0    10  114.321180   \n",
       "12       10604745    548373   4  4.0  4.0  4.0   20.0    22  114.321180   \n",
       "13       40434994    548373   3  3.0  3.0  4.0    0.0    18  114.321180   \n",
       "14       13524592    548373   3  3.0  3.0  3.0    0.0    23  114.321180   \n",
       "15      802687816    548373   5  5.0  5.0  5.0    0.0    18  114.321180   \n",
       "16       90349827    548373   4  4.0  4.0  4.0    0.0    21  114.321180   \n",
       "17       31576559    548373   5  4.0  4.0  4.0    0.0    17  114.321180   \n",
       "18      848650581    548458   5  5.0  5.0  5.0    0.0    20  114.260987   \n",
       "19      833721460    548458   4  3.0  3.0  3.0    0.0     8  114.260987   \n",
       "20       90349827    548458   3  4.0  3.0  3.0    0.0    22  114.260987   \n",
       "21       47048946    548512   3  3.0  4.0  4.0    0.0    11  114.342934   \n",
       "22       18264607    548512   4  4.0  5.0  5.0    0.0     1  114.342934   \n",
       "23      836397020    548512   4  4.0  4.0  4.0  100.0     7  114.342934   \n",
       "24      135686523    548512   3  3.0  3.0  3.0    0.0    20  114.342934   \n",
       "25     1271268684    548512   5  5.0  5.0  5.0    0.0    21  114.342934   \n",
       "26       86872257    548512   5  5.0  4.0  5.0    0.0    11  114.342934   \n",
       "27      177637147    548512   5  5.0  5.0  5.0    0.0     6  114.342934   \n",
       "28     1163278107    548530   4  4.0  3.0  3.0    0.0    20  114.244588   \n",
       "29      580003129    548530   4  5.0  4.0  4.0    0.0    14  114.244588   \n",
       "...           ...       ...  ..  ...  ...  ...    ...   ...         ...   \n",
       "38889    18494906  98704383   4  4.0  4.0  3.0    0.0     8  114.268695   \n",
       "38890   857959952  98711181   4  5.0  4.0  4.0   25.0    18  114.144302   \n",
       "38891   721091356  98711181   5  5.0  5.0  5.0    0.0    18  114.144302   \n",
       "38892    33529960  98711181   4  4.0  4.0  4.0    0.0    11  114.144302   \n",
       "38893     1292938  98711181   3  4.0  4.0  3.0    0.0    20  114.144302   \n",
       "38894    14429811  98723987   5  5.0  4.0  4.0    0.0    20  114.314525   \n",
       "38895   140134019  98723987   5  5.0  4.0  5.0    0.0    14  114.314525   \n",
       "38896    13458975  98723987   5  5.0  5.0  4.0    0.0     9  114.314525   \n",
       "38897  1339879100  98741019   4  4.0  4.0  2.0  100.0    16  114.277901   \n",
       "38898    38619572  98741019   5  5.0  4.0  5.0    0.0    12  114.277901   \n",
       "38899    39575780  98741019   4  4.0  4.0  4.0    0.0     7  114.277901   \n",
       "38900    25847575  98741019   4  4.0  4.0  4.0    0.0     0  114.277901   \n",
       "38901    26143336  98741019   5  5.0  5.0  5.0    0.0    17  114.277901   \n",
       "38902     3681693  98744031   3  3.0  2.0  3.0    0.0    22  114.248790   \n",
       "38903   818102587  98744031   4  4.0  4.0  5.0   40.0    19  114.248790   \n",
       "38904   827569443  98768709   5  5.0  5.0  5.0    0.0    21  114.220962   \n",
       "38905    15560334  98768709   4  4.0  4.0  4.0    0.0    21  114.220962   \n",
       "38906    38835704  98768709   5  5.0  5.0  5.0    0.0    13  114.220962   \n",
       "38907   110769221  98776222   5  5.0  5.0  5.0    0.0    23  114.302148   \n",
       "38908    21119410  98776222   4  4.0  4.0  4.0  100.0    23  114.302148   \n",
       "38909    39188392  98776222   5  5.0  5.0  5.0  100.0    20  114.302148   \n",
       "38910    75416942  98776222   4  3.0  4.0  4.0    0.0    15  114.302148   \n",
       "38911    25600629  98776222   5  5.0  4.0  4.0    0.0    12  114.302148   \n",
       "38912   130131274  98776222   5  5.0  5.0  5.0    0.0    16  114.302148   \n",
       "38913    57597185  98779405   5  5.0  5.0  5.0    0.0    22  114.256547   \n",
       "38914    10511471  98779405   4  3.0  4.0  5.0    0.0    17  114.256547   \n",
       "38915  1202776129  98779405   4  3.0  4.0  3.0    0.0    22  114.256547   \n",
       "38916     3081272  98785465   3  3.0  3.0  3.0    0.0    19  114.332129   \n",
       "38917  1053104032  98785465   5  5.0  5.0  5.0    0.0    17  114.332129   \n",
       "38918    25139936  98785465   3  3.0  3.0  3.0    0.0     8  114.332129   \n",
       "\n",
       "              纬度       菜系  \n",
       "0      30.578830       火锅  \n",
       "1      30.578830       火锅  \n",
       "2      30.578830       火锅  \n",
       "3      30.578830       火锅  \n",
       "4      30.578830       火锅  \n",
       "5      30.578830       火锅  \n",
       "6      30.578830       火锅  \n",
       "7      30.578830       火锅  \n",
       "8      30.578830       火锅  \n",
       "9      30.578830       火锅  \n",
       "10     30.539450       素菜  \n",
       "11     30.539450       素菜  \n",
       "12     30.539450       素菜  \n",
       "13     30.539450       素菜  \n",
       "14     30.539450       素菜  \n",
       "15     30.539450       素菜  \n",
       "16     30.539450       素菜  \n",
       "17     30.539450       素菜  \n",
       "18     30.544928       素菜  \n",
       "19     30.544928       素菜  \n",
       "20     30.544928       素菜  \n",
       "21     30.538502  湖北菜/家常菜  \n",
       "22     30.538502  湖北菜/家常菜  \n",
       "23     30.538502  湖北菜/家常菜  \n",
       "24     30.538502  湖北菜/家常菜  \n",
       "25     30.538502  湖北菜/家常菜  \n",
       "26     30.538502  湖北菜/家常菜  \n",
       "27     30.538502  湖北菜/家常菜  \n",
       "28     30.575134       汤包  \n",
       "29     30.575134       汤包  \n",
       "...          ...      ...  \n",
       "38889  30.610074       川菜  \n",
       "38890  30.622604     面包甜点  \n",
       "38891  30.622604     面包甜点  \n",
       "38892  30.622604     面包甜点  \n",
       "38893  30.622604     面包甜点  \n",
       "38894  30.509828      小龙虾  \n",
       "38895  30.509828      小龙虾  \n",
       "38896  30.509828      小龙虾  \n",
       "38897  30.598616      粤菜馆  \n",
       "38898  30.598616      粤菜馆  \n",
       "38899  30.598616      粤菜馆  \n",
       "38900  30.598616      粤菜馆  \n",
       "38901  30.598616      粤菜馆  \n",
       "38902  30.632296       烧烤  \n",
       "38903  30.632296       烧烤  \n",
       "38904  30.563103       火锅  \n",
       "38905  30.563103       火锅  \n",
       "38906  30.563103       火锅  \n",
       "38907  30.555387       湘菜  \n",
       "38908  30.555387       湘菜  \n",
       "38909  30.555387       湘菜  \n",
       "38910  30.555387       湘菜  \n",
       "38911  30.555387       湘菜  \n",
       "38912  30.555387       湘菜  \n",
       "38913  30.536278     四川火锅  \n",
       "38914  30.536278     四川火锅  \n",
       "38915  30.536278     四川火锅  \n",
       "38916  30.536633       小吃  \n",
       "38917  30.536633       小吃  \n",
       "38918  30.536633       小吃  \n",
       "\n",
       "[38919 rows x 11 columns]"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:12: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n",
      "  if sys.path[0] == '':\n",
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n",
      "  \n",
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:8: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n",
      "  \n",
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:10: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    }
   ],
   "source": [
    "for i in range(38919):\n",
    "    id = rating_df.loc[i]['id']\n",
    "    if rating_df.loc[i]['总分']==0:\n",
    "        rating_df.set_value(i,'总分',res_df[res_df['id']==id]['星级'].values[0])\n",
    "    if rating_df.loc[i]['口味']==0:\n",
    "        rating_df.set_value(i,'口味',res_df[res_df['id']==id]['人均口味'].values[0]/2)\n",
    "    if rating_df.loc[i]['环境']==0:\n",
    "        rating_df.set_value(i,'环境',res_df[res_df['id']==id]['人均环境'].values[0]/2)\n",
    "    if rating_df.loc[i]['服务']==0:\n",
    "        rating_df.set_value(i,'服务',res_df[res_df['id']==id]['人均服务'].values[0]/2)\n",
    "    if rating_df.loc[i]['消费']==0:\n",
    "        rating_df.set_value(i,'消费',res_df[res_df['id']==id]['人均消费'].values[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [],
   "source": [
    "time=rating_df['评论时间'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEICAYAAACqMQjAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAF/5JREFUeJzt3X+QXWWd5/H3N935ZX4txExEUDArAjIShSYSQW1mwo8MUiNsRmaAHUtGEReHXbFqxZGFghWhLIsFiQIZgUVqwgzMDKyu8sMoUTbCShoJRiGGWgIECAkBEzIQoLu/+8c9STpJn/RNyLmn0/1+Vd3K7e89ffo5nZv7yXOe8zwnMhNJkvozou4GSJIGL0NCklTKkJAklTIkJEmlDAlJUilDQpJUqrKQiIi9I+K4iHh7VT9DklStSkIiIvYC/jcwA7gvIqZExA0R8UBEXNhnu6ZqkqR6VNWTOAw4PzMvA+4B/gRoy8yZwLSIODAiTm2mVlH7JElNaK9ip5n5c4CI+BiN3sTewG3Fy/cCxwAfarK2vIo2SpIGVklIAEREAKcBLwMJPFu89BJwODCuyVp/+z4bOBtg3LhxRxx88MEVHIEkDV1dXV0vZuaUgbarLCSysSjUuRHx34E5wN8XL42ncZprAzC2iVp/+54HzAPo6OjIxYsXV3EIkjRkRcRTzWxX1cD1VyLir4sv/x1wBY1TRwDTgRVAV5M1SVJNqupJzANui4jPAkuBO4FfRMQ7gdnAUTROQd3fRE2SVJOqBq5fBo7rW4uIzqL2zcxctzM1SVI9KhuT2FYRHLftSm1nvfnmm6xcuZKNGze+ld0MW2PGjGG//fZj5MiRdTdFUs1aFhKttHLlSiZMmMABBxxA4yIrNSszWbt2LStXruQ973lP3c2RVLMhuXbTxo0bmTx5sgGxCyKCyZMn2wuTBAzRkAAMiLfA352kTYZsSOwp1q5dy6233go0xlK857ikwWRIjkls64ALfrRb97fiipPe0vdfffXVjB49mnPOOYfx48dzwQUXcOihh3L55ZfzwgsvMGJEI7u7urpYsWIFkyZN6nc/F110EcceeywLFixgwoQJnHvuucyZM4cf//jHtLW1bd5u5cqVdHR0sO3M9GXLlvHQQw+x3377vaXjkdS/nfnseaufK1UZFiFRh5///OecfvrpHHjggTz++OOsWrVq82vt7e2MHDmSnp4eXnrpJa688kre8Y53bO5RbNLZ2cmoUaP63f+GDRuYOHEiDzzwAKtXr2bVqlU89dRTjBs3jra2Nnp7ewEYMWIEo0ePLm1n3zCRVL9mg6VVoWJIVKS9vZ1TTjmFuXPncuSRR3LjjTeydOlS2tvbWbJkCSNGjKC9vZ158+axaNEiTjjhBHp6ejZ//9133w2Ujw+sW7eOtWvXMnfuXD74wQ/ykY98hLlz5/LEE0/wsY99jCeeeII777yTGTNm0NbWxumnn8773//+rfbx2GOPlYaQJIEhUZm2tjbuuOMOli5dyurVqznrrLN45plneNe73sV1113HmDFjOO2007jpppsA6O7u5qc//SnQ6EG0t+/4r6atrY0VK1bw5S9/mWXLlrFq1SoeffRRLrvsMt773vdy/fXXM2PGDG6++Wbmz5/PpEmTeO6557bbz5lnnsl5553H7Nmzd/8vQdIez4HrirS1tXHKKaewcOFC9tlnH1577TVOPvlk1q3rfxL5448/zqxZs5g1axZLlizZ6rXPf/7zdHZ2bn5ceumldHd3c/HFF/Pmm29y/vnn86UvfYl99tmHrq4unn76aaZNmwbApz/9aa666io2btxIR0cHkyZNYuLEiXR0dPDqq69y5ZVXGhCSStmTqMimMQFoTFAbO3Ys5557LmUr1h5yyCEsWLAAaPQk+rr++uu3237RokVceOGFLF++nCVLlvDII4/w5JNPcuqppwJs9cHf29tLV1cX69evZ/Xq1WQmv//971m+fPlWp7gkaVuGREW6u7s3n2569tnGLTI+97nPAbB8+fb3UXrkkUeYNWsWAEuWLKG7u3uH+z/66KP51Kc+xYMPPsjs2bM59NBDGTlyJIcffjh33nknF1100eZtJ0yYwFlnncXkyZP59a9/TW9vL0cccQQvvvgiEydO3F2HLGkIGhYhUcelZT09PZsHri+55JKtXts0F6K3t3fz8xdffHG7fbzxxhubL4ftzznnnMO4ceP4+te/zv7778+TTz7Jb3/7W0aPHs3DDz9MR0cHAD/72c9YuHAhbW1tm3sSzzzzDL29vXR0dPDud797dx22pCFmWIREHTo6OjjooIMAuPjiizfXb7/9dr797W/zve99jw0bNvD666/3+/1nnHEG3d3dpVcfvfzyy3zhC19g2rRp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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15696420ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(time.index,time.values,label='时间-数量')\n",
    "plt.xlabel('时间')\n",
    "plt.ylabel('评论数量')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df.replace({'消费':0},rating_df.mean(),inplace = True)\n",
    "rating_df.replace({'总分':0},rating_df.mean(),inplace = True)\n",
    "rating_df.replace({'口味':0},rating_df.mean(),inplace = True)\n",
    "rating_df.replace({'服务':0},rating_df.mean(),inplace = True)\n",
    "rating_df.replace({'环境':0},rating_df.mean(),inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [],
   "source": [
    "money = rating_df[rating_df['消费']!=0]['消费'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEHCAYAAABbZ7oVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAGY1JREFUeJzt3XuYHXWd5/H3l06AkNuQ0JMFIYQsKBcVgeaOmKg4Zl0WzWYQHRxWdjYauSgCMxEYeOABja6D7Caah+ygiyy4MC4iKA4MIhsGApKAMHINOwQMCCQkJhOZYC7f/aMqSdPpSncnfU715f16nvN0nd+pVH270n0+/atf1e9EZiJJUmd2qrsASVLfZUhIkioZEpKkSoaEJKmSISFJqmRISJIqGRKSpEqGhCSpkiEhSao0pO4CdtQee+yREyZMqLsMSeo3Fi1atDwzW7uzbr8PiQkTJrBw4cK6y5CkfiMiXuzuup5ukiRVMiQkSZUMCUlSpX4/JtGZdevWsXTpUtauXVt3Kf3Srrvuyt57783QoUPrLkVSzQZkSCxdupSRI0cyYcIEIqLucvqVzOSNN95g6dKl7LfffnWXI6lmA/J009q1axk7dqwBsR0igrFjx9oLkwQM0JAADIgd4LGTtMmADYm+YP369ZuX/ZhYSf3RgByT6GjCzJ/26vaWzPpYt9Y7++yzOe2005g0aRI//OEPmT9/PrNnz37bOh/60If4+c9/DsAZZ5zBlVdeyT777NPlti+99FImT57MPffcw8iRIznrrLOYNm0ad955Jy0tLZvXW7p0KW1tbRx44IFv+/fPPvssjzzyCHvvvXe3vhdJg5M9iQZ58803efTRRznxxBNZt24dc+fOZfny5fziF78Aip7Fhg0bGDZsGOvXr2fJkiXMnz+fq666ilNPPZWvfvWrldtes2YNo0aNYsGCBbz++ussXryYF198keHDh9PS0sLGjRvZuHEjALvsskvldtqHiSR1ZlD0JOowZ84cDj74YHbaaSfOOeccvvCFL3DyySfziU98gmXLlrHvvvvyxS9+kV//+tdMnTqVIUOGcOCBBzJr1izOO+88Pv7xj1due9WqVbzxxhvMmTOH973vfRx33HHMmTOH559/nhNPPJHnn3+e2267jaOOOoqWlhY+/elPc/DBB79tG08//TQ777xzow+DpH7OkGiA5557jhtvvJHDDjuMM844gwkTJjBp0iR22WUXZs6cybe//W1OOeUULrjgAs4//3zOOeccWltbGTNmDJMnT2bKlClbvam319LSwpIlSzj//PN59tlnefXVV3niiSe46qqr2H///bn22ms56qijuP7667npppsYPXo0r7zyylbbOf300zn33HOZMmVKIw+HpH7M000NsHLlSmbNmgXArFmzOOCAA7jjjjsAmDlzJjfffDOf+tSnuPXWW5k4cSK33347Dz74IBdddBEXXnghK1as4DOf+QwPP/wwn/vc55g0adLmxxVXXMH69eu57LLLWLduHV/+8pc577zz2HPPPVm0aBEvvfQSEydOBIoxjmuuuYa1a9fS1tbG6NGjGTVqFG1tbbz55ptcffXVBoSkbbIn0QBHH300y5cv5+abb2bPPffkzTff3DwYvdtuuwFwzz33cMghh7B69Wouv/xyvva1r/HSSy8xb948APbff38mTpzItddeu9X2H3jgAS655BIWL17M448/zq9+9SteeOEFpk6dCvC2N/6NGzeyaNEiVq9ezeuvv05m8txzz7F48WI2bNjQ6EMhqZ8zJJrghRde4Ljjjntb25gxY/jSl77EggULGDNmDEceeSTjxo3jggsuYMmSJcycOZPW1s6nez/++OM59dRTeeihh5gyZQqHHHIIQ4cO5fDDD+e2227j0ksv3bzuyJEjOfPMMxk7diyPPfYYGzdu5IgjjmD58uWMGjWqod+3pP5vUIREdy9Z7U2bri567bXXNl+11N4RRxzxtucRwdy5c/nJT37C2rVr6eqDlD7/+c8zfPhwrrzySvbdd19eeOEFnnzySXbZZRceffRR2traALj33nu57777aGlp2dyT+M1vfsPGjRtpa2tj/PjxvfdNSxpwBkVI1OGtt95i/fr1XHjhhXz9619np52K4Z/Vq1e/bb1N01+sW7eOGTNmbO5JXHDBBZXbXrlyJTNmzGDixIk89NBDPPXUU3z2s5/lm9/8JuPGjWPatGncdNNNrFq1ihtuuIHRo0cDxWW5mcmIESMAmD17Nu94xzs48sgjG3EIJA0A0d/vBG5ra8uOn0z39NNPc9BBB9VUUc+sWrWK0aNHbx4f6O69C+vXr2fIkCLjM5ONGzdu/reZucNTa/SnYyipZyJiUWa2dWfdAduT6I03ymbY9Fd+T29s2xQQUJyqav/vd/T77u9/OEjqPQPyEthdd92VN954wze77bBpqvBdd9217lIk9QEDsiex9957s3TpUpYtW1Z3Kf3Spg8dkqQBGRJDhw71A3MkqRcMyNNNkqTeYUhIkioZEpKkSg0NiYgYFxH3l8vjI+K+iLg3IuZFYWhE3BERD0TEmeV6W7VJkurRsJCIiN2B64HhZdPngBmZ+UFgH+A9wDnAosw8HpgWESMr2iRJNWhkT2ID8ElgNUBmXpyZT5evjQWWA5OAW8q2+UBbRZskqQYNC4nMXJ2Zqzq2R8QngScz8xWKXsbL5UsrgHEVbR23MT0iFkbEQu+FkKTGaerAdURMBC4AvlQ2rQGGlcsjyno6a3ubzJyXmW2Z2VY1nbYkacc1LSTKMYofAGe262EsAk4olw8FllS0SZJq0Mw7rmcC44HZ5QR0l1EMbN8ZEe8HDgYepjjV1LFNklSD2qcKj4i9KHoOd23qYXTWVqWzqcIlSdX61VTh5QD2LV21SZKazzuuJUmVDAlJUiVDQpJUyZCQJFUyJCRJlQwJSVIlQ0KSVMmQkCRVMiQkSZUMCUlSJUNCklTJkJAkVTIkJEmVDAlJUiVDQpJUyZCQJFUyJCRJlQwJSVIlQ0KSVMmQkCRVMiQkSZUMCUlSJUNCklSpoSEREeMi4v5yeWhE3BERD0TEmT1pkyTVo2EhERG7A9cDw8umc4BFmXk8MC0iRvagTZJUg0b2JDYAnwRWl88nAbeUy/OBth60vU1ETI+IhRGxcNmyZQ0oXZIEDQyJzFydmavaNQ0HXi6XVwDjetDWcdvzMrMtM9taW1sbUb4kieYOXK8BhpXLI8p9d7dNklSDZr4BLwJOKJcPBZb0oE2SVIMhTdzX9cCdEfF+4GDgYYrTSt1pkyTVoOE9icycVH59ETgJeAD4cGZu6G5bo2uUJHWumT0JMvMVtly51KM2SVLzOSgsSapkSEiSKhkSkqRKhoQkqZIhIUmqZEhIkioZEpKkSoaEJKmSISFJqmRISJIqGRKSpEqGhCSpkiEhSapkSEiSKhkSkqRKhoQkqZIhIUmqZEhIkioZEpKkSoaEJKmSISFJqmRISJIqNS0kImL3iLgzIhZGxLVl23URsSAiLmm33lZtkqR6dDskIuJPOmk7ogf7+gxwY2a2ASMj4i+Blsw8FpgYEQdExNSObT3YviSplw3Z1osRsRewAVgHnBsRS4AWYDVwBHA2cFI39/UG8O6I+CNgH2AVcEv52t3ACcBhnbQt7qSu6cB0gPHjx3dz95KknuqqJ7EQeBT4CkUwfAO4i+IN+svAv/ZgX/8I7AucCzwN7Ay8XL62AhgHDO+kbSuZOS8z2zKzrbW1tQclSJJ6oquQeLZ8PAMkMB94HlgObOzhvi4DPp+ZV5Tb+zQwrHxtRFnLmk7aJEk16e6bcAIBHAD8McWppnFU/KVfYXfgPRHRAhwNzKI4nQRwKLAEWNRJmySpJtsck9iGbPforq8B36M45bQA+BZwfznuMQU4ptxexzZJUk16ejrnOeA1inGK18tHt2TmLzPzkMwckZknZeZqYBLwEDA5M1d11tbD+iRJvairnsSB5ddDKE43fQB4J7AHxVVOOyQzV7LlaqbKNklSPboKiTbgLYrLYH8AfImi9/EvwD8Dpze0OklSrbYZEpm56XJUIuKmzHym3cv/MyIeb1hlkqTadTlwHREBHJGZ3+/k5d/1fkmSpL6iuwPXP46IqyPi7Ig4EjZPyXFT40qTJNWtq2k5IjMzIp4HrqW4fHVKOUHfW8CfNqFGSVJNujrd9LOIWAOMBvanuImuDbid4oqnVmBpQyuUJNWmq5CYRtF7OBu4AvgtcEpmboiICcB3I+JDmdmTm+okSf1EVyHxBYqpOJYDTwDXAC9ExI3Au4G/MiAkaeDqauB6FMVUGcdRzNo6BHgc+BUwAXiykcVJkurVVUjcA7xA8TkPzwKfoJh476MU04Zf1NDqJEm16iokJgN/AOYA7wJuoJgq/KHMvAH4txHhdN6SNEB1dcf1ZRExnOLqpg3l+pdk5oPlKjMys6efKyFJ6ie67AVk5u8z8xXgIIrPn34QICLGAb9vcH2SpBp161RRREwEvsmWWWEBPgvc24iiJEl9Q5chERHHA3OBU4GzI+IDAJk5i2L6cEnSAFU5JlGORdxIcXXTKZm5NiLOAP4W+L/lan9ofImSpLpsa+B6PXAr8Gng9Ih4CvgI8I6IuIbiMyX2aXyJkqS6VJ5uysy3MvP7mflRYCQwC/hH4Hzgp8DfU1wiK0kaoLrzeRJ7Z+a3IuI1YGRm3hMRfws8kJkPNL5ESVJdupoqfD/gpoj4KDAR2Cki3gO8BlwTEa9k5l1NqFOSVIOuehL/BTg9M1dFxDTgXLZc0fQIsLKRxUmS6rWtq5sC+D6wJCL2Ar5LMSZxUWZe2aT6JEk12tZ9EkMo5mw6CPgFcAzwTuDEHdlhRHwnIk4ul6+LiAURcUm717dqkyTVY1tXN60D1mfmrzPzXcBs4M0d2VlEvB/4N5l5R0RMpZjm41hgYkQc0FnbjuxPkrRjuhqTODoiHmz3PIADy7YAhmfme7uzo4gYCvwP4M6IOAWYBNxSvnw3cALFlOQd2xZ3Z/uSpN7XVUj8MjP/BCAi3gm8DNyWmSdtx77+HHiK4nMozgHOAq4rX1sBHA4ML/fRvm0rETEdmA4wfvz47ShFktQdlaebImII0BIRe0TEPcDfUHze9fbO13QYMC8zXwX+FzAfGFa+NqKsZU0nbVvJzHmZ2ZaZba2trdtZjiSpK9sauN4AnJ+Zy4E/z8yTgWeA2yLisog4qIf7ep7iXguANoqPPz2hfH4osARY1EmbJKkmlaebMjMj4hMR8fHMvDwirmLLhH5jgVsj4tjM/F0393Ud8N2IOA0YSjEmcXt5ee0UiqunEri/Q5skqSbbuk/ivRRXGv112XQy8Hm2nG56EtgN6FZIZOa/AH/aYR+TgJOAb2Tmqqo2SVI9ttWTeAJ4AjaPT/x9u48tBdjheZsycyVbrmaqbJMk1aPLCf4AMnM98JcNrkWS1Md06+NLJUmDkyEhSapkSEiSKhkSkqRKhoQkqZIhIUmqZEhIkioZEpKkSoaEJKmSISFJqmRIdMOEmT+tuwRJqoUhIUmqZEhIkioZEpKkSoaEJKmSISFJqmRISJIqGRKSpEqGhCSpkiHRgTfOSdIWhoQkqZIhIUmq1PSQiIhxEfFYuXxdRCyIiEvavb5VmySpHnX0JL4JDIuIqUBLZh4LTIyIAzprq6E+SVKpqSERER8Efg+8CkwCbilfuhs4oaKts+1Mj4iFEbFw2bJljSxZkga1poVEROwM/DUws2waDrxcLq8AxlW0bSUz52VmW2a2tba2Nq5oSRrkmtmTmAl8JzN/Vz5fAwwrl0eUtXTWJkmqSTPfhD8MnBUR9wHvA05my+mkQ4ElwKJO2iRJNRnSrB1l5omblsug+A/A/RGxFzAFOAbITtoabsLMn7Jk1seasStJ6ldqOZ2TmZMyczXFQPVDwOTMXNVZWx31SZIKTetJdCYzV7LlaqbKNklSPRwY3gbncZI02BkSkqRKhoQkqZIhIUmqZEhIkioZEpKkSoaEJKmSISFJqmRIbAfvn5A0WBgSkqRKhoQkqZIhIUmqZEhIkioZEiUHoyVpa4aEJKmSIdEFexiSBjNDoocMDUmDiSEhSapkSEiSKhkSkqRKhoQkqdKgD4neGoh2QFvSQNS0kIiI0RHxs4i4OyJ+FBE7R8R1EbEgIi5pt95WbZKkejSzJ/FnwNWZ+RHgVeA0oCUzjwUmRsQBETG1Y1sT65MkdTCkWTvKzO+0e9oKnA5cUz6/GzgBOAy4pUPb4o7biojpwHSA8ePHN6hiSVLTxyQi4lhgd+A3wMtl8wpgHDC8k7atZOa8zGzLzLbW1tZer9HxBUkqNDUkImIMMBs4E1gDDCtfGlHW0llbLQwKSWruwPXOwN8BX8nMF4FFFKeTAA4FllS0SZJq0rQxCeA/A4cDF0fExcD3gM9ExF7AFOAYIIH7O7RJkmrSzIHrucDc9m0RcTtwEvCNzFxVtk3q2CZJqkczexJbycyVbLmaqbJNklSPQX/HtSSpmiEhSapkSGwnL5GVNBgYEpKkSoaEJKmSIdGOp5Ak6e0MCUlSpUEdEvYcJGnbBnVISJK2zZBoAHsokgYKQ0KSVMmQ2AETZv7UXoOkAc2Q6EUGhqSBxpDoBYaDpIHKkJAkVTIkJEmVDAlJUiVDQpJUyZBoEAezJQ0EhoQkqZIh0YfZG5FUN0OiSQbTG/5g+l6lga5PhkREXBcRCyLikrprkaTBrM+FRERMBVoy81hgYkQcUHdNPdGIv6Ib+Zd5b2zbnoM0cPW5kAAmAbeUy3cDJ9RXSu/aNCFg+8f2bGOg2PS9DKTvSRpoIjPrruFtIuI64L9n5uMR8RHg8Myc1WGd6cD08um7gGe3c3d7AMu3u9jmsMbeYY29oz/UCP2jzjpr3DczW7uz4pBGV7Id1gDDyuURdNLbycx5wLwd3VFELMzMth3dTiNZY++wxt7RH2qE/lFnf6gR+ubppkVsOcV0KLCkvlIkaXDriz2J24D7I2IvYApwTM31SNKg1ed6Epm5mmLw+iFgcmauauDudviUVRNYY++wxt7RH2qE/lFnf6ix7w1cS5L6jj7Xk5Ak9R2GhCSp0qANib409UdEjI6In0XE3RHxo4jYOSJeioj7ysd7yvUuj4hHIuLbNdQ4pGNNndVTc40z2tX3q/L/uM8cx4gYFxH3l8tDI+KOiHggIs7sSVsTaxxfHrd7I2JeFN4REUvbHdPWct2m/T51qLHb9TT7d75DnZe3q/GZiPhKXziW3TEoQ6IPTv3xZ8DVmfkR4FVgJvCDzJxUPv4pIo6guDT4KOD1iPhwk2t8b/uagJ071lN3jZk5t1199wPX0keOY0TsDlwPDC+bzgEWZebxwLSIGNmDtmbV+DlgRmZ+ENgHeA9wNHBVu2O6rJm/T53U2K16mv0737HOzLys3c/mr4Hvd7f2RtbZHYMyJOhjU39k5ncy8x/Kp63AeuDfR8Qvy78qhgAfAP5PFlca3AW8v8llHtO+JuBDndRTd41A8dclMA5oo+8cxw3AJ4HV5fNJbPkZnF/W2t22ptSYmRdn5tPla2Mp7g4+BviLiHg0Ir5avta+xkb/PnU8jt2tp5k1dlYnABFxJLA0M1+m/mPZLYM1JIYDL5fLKyjeUGoXEccCuwP/AHw4M48ChgL/jvprfqRDTcM6qafuGjc5C5jL1jXXdhwzc3WHy7k7q6O7bc2qEYCI+CTwZGa+AvyM4o3sSODYiHhvzTV2t56m/r9XHUvgi8DscrnWY9ldffFmumbocuqPZouIMRQ/PP8ReDUz3ypfWggcQP01P9Ghpk1B0b6eumskInYCJgMXAzv3weO4yaY6VpV1rOlBW9NExETgAmDTabkHNx3TiHiM+o9pd+up/f89Iv4I+OPM/H9lU187lp2qvYCa9KmpPyJiZ+DvgK9k5ovADRFxaES0AB8HHqf+mjvWNLyTeuquEYrTRw+Xp5P64nHcpLM6utvWFOV59R8AZ7b7q/iuiNgzInYDPkJxfr3OY9rdevrC//spwJ3tnve1Y9m5zBx0D2AUxRvG1cDTwOia65kBrATuKx+XAU8A/0QxsAVFoD8A/DeKWW/3a3KN725fU2f11F1jWedXgamd1dxHjuN95dd9gSfLOh4BWrrb1sQavw78tt3P5QcoemnPlMf17HK9pv8+tauxW/XU9Tu/qc5y+SaKWa3pSe3N/Pns7DFo77gu/0o6CZifma/WXU93RMQw4GPAo5n5z32xnr5WY2f6So1RzE92AnBXln+pd7etr+lrv0+d1dPXaqzS1+octCEhSeraYB2TkCR1gyEhbafyvotNy1FnLVKjGBLS9psTEZPK5WkRMbvjChHx83bL10fEPs0qTuoNhoS0HcrLFg8H5kfEUIor1PaIiMnl61FeevuvUcx7NQE4Ebg4Im6JiItqKl3qkcF6M520o84GnsrMjWUP4jvAHcCPyonaXqS4bPXdwK0UU608QzEv17coPoFR6vO8uknqoYh4J8XNj48BQXHD0+zMXB4RJ1JMC/Jj4A/A3wB/ASyjmGbhx8DPMtOehPoFQ0LqoYg4GhhDMYHbVygmOxyamd+LiAcz87hyIPtGYE+KO2mfBo6juOP2RIo71udk5sN1fA9SdzkmIfVQ+cb+SLn8W2A3iineAd4sv36Y4k7p31PcQb8fMB6YDhwIvAX0yZsNpfYMCWnH7Qf8pkPbCuAagMxcQREqt2fxeQL/CRiRmcuaWKO0XQwJafvsBMWnj1GcPnqq/YuZuSgzf9++CZgREfcB/7tZRUo7ypCQts8uFFcH/lfgrzJzY9k+qsN6u5ZfhwJzy57EaXhlofoJB66lBoqI0Zm5qrxngszcUHdNUk8YEpKkSp5ukiRVMiQkSZUMCUlSJUNCklTJkJAkVfr/2tNABKekR1AAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1569668d9b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(money.index,money.values,label='价格-数量')\n",
    "plt.xlabel('价格')\n",
    "plt.ylabel('评论数量')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [],
   "source": [
    "money_series = rating_df[rating_df['消费']!=0]['消费']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {},
   "outputs": [],
   "source": [
    "money_count = np.zeros(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [],
   "source": [
    "for m in money_series:\n",
    "        money_count[int(m/20)] += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15696618550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(0,100),money_count,label='价格-数量')\n",
    "plt.xlabel('价格')\n",
    "plt.ylabel('签到数量')\n",
    "plt.xticks([0,20,40,60,80,100],[0,400,800,1200,1600,2000])\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 换了稀疏度更小的rating_df4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {},
   "outputs": [],
   "source": [
    "counts_u = rating_df.用户id.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [],
   "source": [
    "cu = counts_u[counts_u>=20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {},
   "outputs": [],
   "source": [
    "counts_v = rating_df.id.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [],
   "source": [
    "cv = counts_v[counts_v>=10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {},
   "outputs": [],
   "source": [
    "u =np.array(cu.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [],
   "source": [
    "v =np.array(cv.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df2 = rating_df[rating_df['用户id'].isin(u)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df3 =rating_df2[rating_df2['id'].isin(v)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [],
   "source": [
    "counts_v = rating_df3.id.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [],
   "source": [
    "cv = counts_v[counts_v>=5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [],
   "source": [
    "v =np.array(cv.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df4 =rating_df3[rating_df3['id'].isin(v)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户id</th>\n",
       "      <th>id</th>\n",
       "      <th>总分</th>\n",
       "      <th>口味</th>\n",
       "      <th>环境</th>\n",
       "      <th>服务</th>\n",
       "      <th>消费</th>\n",
       "      <th>评论时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5.398000e+03</td>\n",
       "      <td>5.398000e+03</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "      <td>5398.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.038469e+08</td>\n",
       "      <td>3.749483e+07</td>\n",
       "      <td>4.205076</td>\n",
       "      <td>4.166627</td>\n",
       "      <td>4.124861</td>\n",
       "      <td>4.160430</td>\n",
       "      <td>51.986689</td>\n",
       "      <td>14.488885</td>\n",
       "      <td>114.281873</td>\n",
       "      <td>30.577101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.489320e+08</td>\n",
       "      <td>3.695509e+07</td>\n",
       "      <td>0.789497</td>\n",
       "      <td>0.821383</td>\n",
       "      <td>0.856570</td>\n",
       "      <td>0.867876</td>\n",
       "      <td>46.092414</td>\n",
       "      <td>6.652646</td>\n",
       "      <td>0.151070</td>\n",
       "      <td>0.143843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>5.525380e+05</td>\n",
       "      <td>5.487860e+05</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>106.212955</td>\n",
       "      <td>22.589607</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2.069340e+07</td>\n",
       "      <td>4.107610e+06</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>114.260873</td>\n",
       "      <td>30.559030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.905442e+07</td>\n",
       "      <td>1.945732e+07</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>43.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>114.279330</td>\n",
       "      <td>30.581521</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.168471e+08</td>\n",
       "      <td>7.350483e+07</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>114.309794</td>\n",
       "      <td>30.600096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.682203e+09</td>\n",
       "      <td>9.844768e+07</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>588.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>118.174507</td>\n",
       "      <td>34.507749</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               用户id            id           总分           口味           环境  \\\n",
       "count  5.398000e+03  5.398000e+03  5398.000000  5398.000000  5398.000000   \n",
       "mean   2.038469e+08  3.749483e+07     4.205076     4.166627     4.124861   \n",
       "std    3.489320e+08  3.695509e+07     0.789497     0.821383     0.856570   \n",
       "min    5.525380e+05  5.487860e+05     1.000000     1.000000     1.000000   \n",
       "25%    2.069340e+07  4.107610e+06     4.000000     4.000000     4.000000   \n",
       "50%    3.905442e+07  1.945732e+07     4.000000     4.000000     4.000000   \n",
       "75%    1.168471e+08  7.350483e+07     5.000000     5.000000     5.000000   \n",
       "max    1.682203e+09  9.844768e+07     5.000000     5.000000     5.000000   \n",
       "\n",
       "                服务           消费         评论时间           经度           纬度  \n",
       "count  5398.000000  5398.000000  5398.000000  5398.000000  5398.000000  \n",
       "mean      4.160430    51.986689    14.488885   114.281873    30.577101  \n",
       "std       0.867876    46.092414     6.652646     0.151070     0.143843  \n",
       "min       1.000000     3.000000     0.000000   106.212955    22.589607  \n",
       "25%       4.000000    20.000000    10.000000   114.260873    30.559030  \n",
       "50%       4.000000    43.000000    15.000000   114.279330    30.581521  \n",
       "75%       5.000000    70.000000    20.000000   114.309794    30.600096  \n",
       "max       5.000000   588.000000    23.000000   118.174507    34.507749  "
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_df4.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df4.index = np.array(range(5398))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import cross_validation as cv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data, test_data = cv.train_test_split(rating_df4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户id</th>\n",
       "      <th>id</th>\n",
       "      <th>总分</th>\n",
       "      <th>口味</th>\n",
       "      <th>环境</th>\n",
       "      <th>服务</th>\n",
       "      <th>消费</th>\n",
       "      <th>评论时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>菜系</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>206</th>\n",
       "      <td>4358187</td>\n",
       "      <td>549696</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.298640</td>\n",
       "      <td>30.543976</td>\n",
       "      <td>西式简餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1924</th>\n",
       "      <td>49566709</td>\n",
       "      <td>6423347</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>46.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.267721</td>\n",
       "      <td>30.568644</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4871</th>\n",
       "      <td>18137979</td>\n",
       "      <td>94279058</td>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>42.0</td>\n",
       "      <td>22</td>\n",
       "      <td>114.266361</td>\n",
       "      <td>30.597763</td>\n",
       "      <td>咖啡厅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4431</th>\n",
       "      <td>13733485</td>\n",
       "      <td>90939977</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.192510</td>\n",
       "      <td>30.599439</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5101</th>\n",
       "      <td>1247466943</td>\n",
       "      <td>96300620</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.291148</td>\n",
       "      <td>30.578451</td>\n",
       "      <td>快餐简餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1247</th>\n",
       "      <td>1217226276</td>\n",
       "      <td>3551737</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>58.0</td>\n",
       "      <td>3</td>\n",
       "      <td>114.274116</td>\n",
       "      <td>30.601341</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>646</th>\n",
       "      <td>15198478</td>\n",
       "      <td>2402230</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.360887</td>\n",
       "      <td>30.605702</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3378</th>\n",
       "      <td>24206658</td>\n",
       "      <td>56625542</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.272819</td>\n",
       "      <td>30.538542</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4958</th>\n",
       "      <td>116847068</td>\n",
       "      <td>95856035</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.341780</td>\n",
       "      <td>30.555821</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3603</th>\n",
       "      <td>37231887</td>\n",
       "      <td>65498425</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>15</td>\n",
       "      <td>114.354000</td>\n",
       "      <td>30.527000</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2009</th>\n",
       "      <td>4358187</td>\n",
       "      <td>8848547</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.300661</td>\n",
       "      <td>30.551287</td>\n",
       "      <td>生煎/锅贴</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2461</th>\n",
       "      <td>33707381</td>\n",
       "      <td>15952336</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.267701</td>\n",
       "      <td>30.568770</td>\n",
       "      <td>冰淇淋</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5326</th>\n",
       "      <td>22832317</td>\n",
       "      <td>97706157</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.389153</td>\n",
       "      <td>30.631797</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3343</th>\n",
       "      <td>1217226276</td>\n",
       "      <td>48009478</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>6</td>\n",
       "      <td>114.299986</td>\n",
       "      <td>30.586188</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4888</th>\n",
       "      <td>4559437</td>\n",
       "      <td>94702591</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>50.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.419816</td>\n",
       "      <td>30.456323</td>\n",
       "      <td>咖啡厅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1826</th>\n",
       "      <td>29841445</td>\n",
       "      <td>5857989</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>6</td>\n",
       "      <td>114.207730</td>\n",
       "      <td>30.559030</td>\n",
       "      <td>冰淇淋</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2773</th>\n",
       "      <td>29512795</td>\n",
       "      <td>21255703</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.377968</td>\n",
       "      <td>30.626956</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2888</th>\n",
       "      <td>57778773</td>\n",
       "      <td>22701286</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.298651</td>\n",
       "      <td>30.581171</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4457</th>\n",
       "      <td>17480694</td>\n",
       "      <td>90974084</td>\n",
       "      <td>5</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.194213</td>\n",
       "      <td>30.597885</td>\n",
       "      <td>快餐简餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2140</th>\n",
       "      <td>21209919</td>\n",
       "      <td>9057866</td>\n",
       "      <td>3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.291771</td>\n",
       "      <td>30.578460</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>955</th>\n",
       "      <td>1217226276</td>\n",
       "      <td>2876125</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>69.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.290761</td>\n",
       "      <td>30.578616</td>\n",
       "      <td>比萨</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1612</th>\n",
       "      <td>807331130</td>\n",
       "      <td>5253650</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>32.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.353444</td>\n",
       "      <td>30.524923</td>\n",
       "      <td>快餐简餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2235</th>\n",
       "      <td>4716199</td>\n",
       "      <td>10657714</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>263.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.346670</td>\n",
       "      <td>30.552630</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4858</th>\n",
       "      <td>34109618</td>\n",
       "      <td>94017900</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>55.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.205560</td>\n",
       "      <td>30.551970</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>262</th>\n",
       "      <td>13928938</td>\n",
       "      <td>568622</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>13</td>\n",
       "      <td>114.289252</td>\n",
       "      <td>30.581843</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2460</th>\n",
       "      <td>36989312</td>\n",
       "      <td>15952336</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>7</td>\n",
       "      <td>114.267701</td>\n",
       "      <td>30.568770</td>\n",
       "      <td>冰淇淋</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1706</th>\n",
       "      <td>5718360</td>\n",
       "      <td>5458158</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>57.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.298620</td>\n",
       "      <td>30.541520</td>\n",
       "      <td>西餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2445</th>\n",
       "      <td>35992018</td>\n",
       "      <td>15906856</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.360810</td>\n",
       "      <td>30.616990</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3188</th>\n",
       "      <td>75416942</td>\n",
       "      <td>32458408</td>\n",
       "      <td>4</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>64.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.277564</td>\n",
       "      <td>30.599726</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4889</th>\n",
       "      <td>40657111</td>\n",
       "      <td>94702591</td>\n",
       "      <td>5</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.419816</td>\n",
       "      <td>30.456323</td>\n",
       "      <td>咖啡厅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3379</th>\n",
       "      <td>67458683</td>\n",
       "      <td>56625542</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.272819</td>\n",
       "      <td>30.538542</td>\n",
       "      <td>小吃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>276</th>\n",
       "      <td>1034933465</td>\n",
       "      <td>569920</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.252563</td>\n",
       "      <td>30.569459</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2151</th>\n",
       "      <td>18691117</td>\n",
       "      <td>9409300</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>71.0</td>\n",
       "      <td>16</td>\n",
       "      <td>114.269965</td>\n",
       "      <td>30.580354</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4188</th>\n",
       "      <td>15440987</td>\n",
       "      <td>77464594</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>45.0</td>\n",
       "      <td>17</td>\n",
       "      <td>114.295178</td>\n",
       "      <td>30.586731</td>\n",
       "      <td>快餐简餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2409</th>\n",
       "      <td>45944548</td>\n",
       "      <td>15099548</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>74.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.212281</td>\n",
       "      <td>30.597401</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4336</th>\n",
       "      <td>2336992</td>\n",
       "      <td>90443289</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>75.0</td>\n",
       "      <td>8</td>\n",
       "      <td>114.193203</td>\n",
       "      <td>30.598746</td>\n",
       "      <td>江浙菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3364</th>\n",
       "      <td>29512795</td>\n",
       "      <td>56400566</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>58.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.300189</td>\n",
       "      <td>30.548692</td>\n",
       "      <td>烤鱼</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>254</th>\n",
       "      <td>4473305</td>\n",
       "      <td>568622</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>18</td>\n",
       "      <td>114.289252</td>\n",
       "      <td>30.581843</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1632</th>\n",
       "      <td>29841445</td>\n",
       "      <td>5269461</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.204515</td>\n",
       "      <td>30.593758</td>\n",
       "      <td>面包甜点</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4479</th>\n",
       "      <td>18657658</td>\n",
       "      <td>90985095</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.277180</td>\n",
       "      <td>30.600734</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4693</th>\n",
       "      <td>1213931879</td>\n",
       "      <td>92708496</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>74.0</td>\n",
       "      <td>15</td>\n",
       "      <td>114.274164</td>\n",
       "      <td>30.582010</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4767</th>\n",
       "      <td>18249069</td>\n",
       "      <td>93048324</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>14</td>\n",
       "      <td>114.267376</td>\n",
       "      <td>30.572463</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4404</th>\n",
       "      <td>4358187</td>\n",
       "      <td>90573816</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>79.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.263181</td>\n",
       "      <td>30.614226</td>\n",
       "      <td>火锅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>474</th>\n",
       "      <td>15823359</td>\n",
       "      <td>1966804</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.247421</td>\n",
       "      <td>30.551285</td>\n",
       "      <td>豆皮</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1764</th>\n",
       "      <td>12984446</td>\n",
       "      <td>5604963</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>81.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.304374</td>\n",
       "      <td>30.534303</td>\n",
       "      <td>韩国料理</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4967</th>\n",
       "      <td>25983674</td>\n",
       "      <td>95901506</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>68.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.254364</td>\n",
       "      <td>30.537117</td>\n",
       "      <td>西北菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2070</th>\n",
       "      <td>2833074</td>\n",
       "      <td>8966182</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>11</td>\n",
       "      <td>114.280883</td>\n",
       "      <td>30.583539</td>\n",
       "      <td>卤味</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>501</th>\n",
       "      <td>32923429</td>\n",
       "      <td>2044804</td>\n",
       "      <td>5</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>38.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.299843</td>\n",
       "      <td>30.588818</td>\n",
       "      <td>咖啡厅</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4419</th>\n",
       "      <td>817418600</td>\n",
       "      <td>90912054</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>10</td>\n",
       "      <td>114.269880</td>\n",
       "      <td>30.579950</td>\n",
       "      <td>小吃快餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4966</th>\n",
       "      <td>22018947</td>\n",
       "      <td>95901506</td>\n",
       "      <td>4</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>68.0</td>\n",
       "      <td>20</td>\n",
       "      <td>114.254364</td>\n",
       "      <td>30.537117</td>\n",
       "      <td>西北菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4283</th>\n",
       "      <td>803676620</td>\n",
       "      <td>90093693</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.336065</td>\n",
       "      <td>30.545180</td>\n",
       "      <td>海鲜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3901</th>\n",
       "      <td>62279989</td>\n",
       "      <td>68932704</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>21</td>\n",
       "      <td>114.302637</td>\n",
       "      <td>30.593330</td>\n",
       "      <td>日本料理</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3698</th>\n",
       "      <td>38222494</td>\n",
       "      <td>66684657</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>48.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.273663</td>\n",
       "      <td>30.603396</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4486</th>\n",
       "      <td>116847068</td>\n",
       "      <td>90992071</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>19</td>\n",
       "      <td>114.208380</td>\n",
       "      <td>30.559143</td>\n",
       "      <td>甜品饮品</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4450</th>\n",
       "      <td>1001028019</td>\n",
       "      <td>90968491</td>\n",
       "      <td>5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>85.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.253795</td>\n",
       "      <td>30.730665</td>\n",
       "      <td>小龙虾</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>522</th>\n",
       "      <td>131107265</td>\n",
       "      <td>2103589</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.396775</td>\n",
       "      <td>30.618995</td>\n",
       "      <td>湖北菜/家常菜</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2795</th>\n",
       "      <td>1498451</td>\n",
       "      <td>21279939</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>149.0</td>\n",
       "      <td>0</td>\n",
       "      <td>114.120663</td>\n",
       "      <td>30.607577</td>\n",
       "      <td>烧烤</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1703</th>\n",
       "      <td>5718360</td>\n",
       "      <td>5458158</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>57.0</td>\n",
       "      <td>12</td>\n",
       "      <td>114.298620</td>\n",
       "      <td>30.541520</td>\n",
       "      <td>西餐</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2845</th>\n",
       "      <td>824582928</td>\n",
       "      <td>21960221</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>54.0</td>\n",
       "      <td>23</td>\n",
       "      <td>114.270736</td>\n",
       "      <td>30.600096</td>\n",
       "      <td>粤菜馆</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3680</th>\n",
       "      <td>55909586</td>\n",
       "      <td>66479384</td>\n",
       "      <td>4</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>9</td>\n",
       "      <td>114.297670</td>\n",
       "      <td>30.596400</td>\n",
       "      <td>私房菜</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4048 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            用户id        id  总分   口味   环境   服务     消费  评论时间          经度  \\\n",
       "206      4358187    549696   3  3.0  2.0  2.0   45.0    11  114.298640   \n",
       "1924    49566709   6423347   4  4.0  4.0  4.0   46.0     9  114.267721   \n",
       "4871    18137979  94279058   3  1.0  5.0  5.0   42.0    22  114.266361   \n",
       "4431    13733485  90939977   4  4.0  4.0  5.0   23.0     7  114.192510   \n",
       "5101  1247466943  96300620   4  4.0  4.0  4.0   43.0    23  114.291148   \n",
       "1247  1217226276   3551737   5  5.0  5.0  5.0   58.0     3  114.274116   \n",
       "646     15198478   2402230   4  4.0  4.0  4.0   80.0    23  114.360887   \n",
       "3378    24206658  56625542   4  4.0  4.0  4.0   26.0    23  114.272819   \n",
       "4958   116847068  95856035   4  4.0  2.0  4.0   10.0    14  114.341780   \n",
       "3603    37231887  65498425   5  5.0  5.0  5.0   43.0    15  114.354000   \n",
       "2009     4358187   8848547   4  5.0  2.0  2.0   15.0    21  114.300661   \n",
       "2461    33707381  15952336   4  4.0  4.0  4.0   22.0    23  114.267701   \n",
       "5326    22832317  97706157   4  4.0  4.0  4.0   20.0    21  114.389153   \n",
       "3343  1217226276  48009478   5  5.0  4.0  5.0   72.0     6  114.299986   \n",
       "4888     4559437  94702591   4  4.0  4.0  4.0   50.0    19  114.419816   \n",
       "1826    29841445   5857989   4  5.0  3.0  5.0    8.0     6  114.207730   \n",
       "2773    29512795  21255703   5  5.0  5.0  5.0   28.0    20  114.377968   \n",
       "2888    57778773  22701286   5  5.0  4.0  5.0   60.0    17  114.298651   \n",
       "4457    17480694  90974084   5  4.0  4.0  4.0   12.0     8  114.194213   \n",
       "2140    21209919   9057866   3  4.0  3.0  3.0   14.0    12  114.291771   \n",
       "955   1217226276   2876125   4  4.0  5.0  4.0   69.0    20  114.290761   \n",
       "1612   807331130   5253650   4  4.0  4.0  4.0   32.0    18  114.353444   \n",
       "2235     4716199  10657714   4  3.0  5.0  4.0  263.0    10  114.346670   \n",
       "4858    34109618  94017900   4  4.0  4.0  4.0   55.0    23  114.205560   \n",
       "262     13928938    568622   3  3.0  4.0  4.0   13.0    13  114.289252   \n",
       "2460    36989312  15952336   5  5.0  5.0  5.0   27.0     7  114.267701   \n",
       "1706     5718360   5458158   3  3.0  3.0  3.0   57.0    12  114.298620   \n",
       "2445    35992018  15906856   5  5.0  5.0  5.0   12.0    14  114.360810   \n",
       "3188    75416942  32458408   4  5.0  5.0  5.0   64.0     8  114.277564   \n",
       "4889    40657111  94702591   5  4.0  5.0  5.0   29.0    21  114.419816   \n",
       "...          ...       ...  ..  ...  ...  ...    ...   ...         ...   \n",
       "3379    67458683  56625542   1  1.0  1.0  1.0   26.0    21  114.272819   \n",
       "276   1034933465    569920   5  5.0  4.0  4.0   16.0    14  114.252563   \n",
       "2151    18691117   9409300   5  5.0  5.0  5.0   71.0    16  114.269965   \n",
       "4188    15440987  77464594   4  4.0  4.0  4.0   45.0    17  114.295178   \n",
       "2409    45944548  15099548   4  4.0  5.0  5.0   74.0    14  114.212281   \n",
       "4336     2336992  90443289   3  3.0  4.0  3.0   75.0     8  114.193203   \n",
       "3364    29512795  56400566   5  5.0  5.0  5.0   58.0    20  114.300189   \n",
       "254      4473305    568622   3  3.0  3.0  3.0   13.0    18  114.289252   \n",
       "1632    29841445   5269461   5  5.0  5.0  5.0   20.0    14  114.204515   \n",
       "4479    18657658  90985095   4  4.0  4.0  4.0   27.0    23  114.277180   \n",
       "4693  1213931879  92708496   4  3.0  3.0  3.0   74.0    15  114.274164   \n",
       "4767    18249069  93048324   4  4.0  4.0  4.0   14.0    14  114.267376   \n",
       "4404     4358187  90573816   4  4.0  4.0  4.0   79.0    12  114.263181   \n",
       "474     15823359   1966804   4  4.0  3.0  4.0   12.0     0  114.247421   \n",
       "1764    12984446   5604963   4  4.0  3.0  3.0   81.0    10  114.304374   \n",
       "4967    25983674  95901506   4  4.0  4.0  4.0   68.0     9  114.254364   \n",
       "2070     2833074   8966182   4  4.0  4.0  3.0   20.0    11  114.280883   \n",
       "501     32923429   2044804   5  4.0  5.0  5.0   38.0    20  114.299843   \n",
       "4419   817418600  90912054   5  5.0  5.0  5.0   19.0    10  114.269880   \n",
       "4966    22018947  95901506   4  3.0  4.0  4.0   68.0    20  114.254364   \n",
       "4283   803676620  90093693   5  5.0  4.0  4.0   28.0     9  114.336065   \n",
       "3901    62279989  68932704   5  5.0  5.0  5.0   15.0    21  114.302637   \n",
       "3698    38222494  66684657   5  5.0  5.0  5.0   48.0     9  114.273663   \n",
       "4486   116847068  90992071   4  4.0  4.0  4.0   16.0    19  114.208380   \n",
       "4450  1001028019  90968491   5  5.0  5.0  5.0   85.0    23  114.253795   \n",
       "522    131107265   2103589   3  3.0  3.0  3.0   70.0    23  114.396775   \n",
       "2795     1498451  21279939   3  3.0  2.0  3.0  149.0     0  114.120663   \n",
       "1703     5718360   5458158   3  3.0  3.0  3.0   57.0    12  114.298620   \n",
       "2845   824582928  21960221   3  3.0  3.0  3.0   54.0    23  114.270736   \n",
       "3680    55909586  66479384   4  4.0  4.0  4.0   28.0     9  114.297670   \n",
       "\n",
       "             纬度       菜系  \n",
       "206   30.543976     西式简餐  \n",
       "1924  30.568644  湖北菜/家常菜  \n",
       "4871  30.597763      咖啡厅  \n",
       "4431  30.599439     小吃快餐  \n",
       "5101  30.578451     快餐简餐  \n",
       "1247  30.601341       烧烤  \n",
       "646   30.605702      小龙虾  \n",
       "3378  30.538542       小吃  \n",
       "4958  30.555821       小吃  \n",
       "3603  30.527000     甜品饮品  \n",
       "2009  30.551287    生煎/锅贴  \n",
       "2461  30.568770      冰淇淋  \n",
       "5326  30.631797     甜品饮品  \n",
       "3343  30.586188       烧烤  \n",
       "4888  30.456323      咖啡厅  \n",
       "1826  30.559030      冰淇淋  \n",
       "2773  30.626956     面包甜点  \n",
       "2888  30.581171       烧烤  \n",
       "4457  30.597885     快餐简餐  \n",
       "2140  30.578460     小吃快餐  \n",
       "955   30.578616       比萨  \n",
       "1612  30.524923     快餐简餐  \n",
       "2235  30.552630      粤菜馆  \n",
       "4858  30.551970     甜品饮品  \n",
       "262   30.581843     小吃快餐  \n",
       "2460  30.568770      冰淇淋  \n",
       "1706  30.541520       西餐  \n",
       "2445  30.616990     甜品饮品  \n",
       "3188  30.599726       小吃  \n",
       "4889  30.456323      咖啡厅  \n",
       "...         ...      ...  \n",
       "3379  30.538542       小吃  \n",
       "276   30.569459     小吃快餐  \n",
       "2151  30.580354     甜品饮品  \n",
       "4188  30.586731     快餐简餐  \n",
       "2409  30.597401       火锅  \n",
       "4336  30.598746      江浙菜  \n",
       "3364  30.548692       烤鱼  \n",
       "254   30.581843     小吃快餐  \n",
       "1632  30.593758     面包甜点  \n",
       "4479  30.600734  湖北菜/家常菜  \n",
       "4693  30.582010       火锅  \n",
       "4767  30.572463     小吃快餐  \n",
       "4404  30.614226       火锅  \n",
       "474   30.551285       豆皮  \n",
       "1764  30.534303     韩国料理  \n",
       "4967  30.537117      西北菜  \n",
       "2070  30.583539       卤味  \n",
       "501   30.588818      咖啡厅  \n",
       "4419  30.579950     小吃快餐  \n",
       "4966  30.537117      西北菜  \n",
       "4283  30.545180       海鲜  \n",
       "3901  30.593330     日本料理  \n",
       "3698  30.603396       烧烤  \n",
       "4486  30.559143     甜品饮品  \n",
       "4450  30.730665      小龙虾  \n",
       "522   30.618995  湖北菜/家常菜  \n",
       "2795  30.607577       烧烤  \n",
       "1703  30.541520       西餐  \n",
       "2845  30.600096      粤菜馆  \n",
       "3680  30.596400      私房菜  \n",
       "\n",
       "[4048 rows x 11 columns]"
      ]
     },
     "execution_count": 228,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import sqrt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_absolute_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rmse(prediction,truth):\n",
    "    prediction = prediction[truth.nonzero()].flatten()\n",
    "    truth = truth[truth.nonzero()].flatten()\n",
    "    return sqrt(mean_squared_error(prediction,truth))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [],
   "source": [
    "def mae(prediction,truth):\n",
    "    prediction = prediction[truth.nonzero()].flatten()\n",
    "    truth = truth[truth.nonzero()].flatten()\n",
    "    return mean_absolute_error(prediction,truth)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {},
   "outputs": [],
   "source": [
    "users = rating_df4.用户id.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [],
   "source": [
    "items = rating_df4.id.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_users = users.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_items = items.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(279, 623)"
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n_users,n_items"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_matrix = None\n",
    "g_train_matrix = None\n",
    "h_train_matrix = None\n",
    "o_train_matrix = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_matrix = None\n",
    "g_test_matrix = None\n",
    "h_test_matrix = None\n",
    "o_test_matrix = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {},
   "outputs": [],
   "source": [
    "def set_feature_matrix(feature, types):\n",
    "    matrix = np.zeros((n_users,n_items))\n",
    "    if types=='train':\n",
    "        data = train_data\n",
    "    else:\n",
    "        data = test_data\n",
    "    for line in data.itertuples():\n",
    "        i = int(np.argwhere(users==line[1]))\n",
    "        j = int(np.argwhere(items==line[2]))\n",
    "        truth = line[feature]\n",
    "        matrix[i,j] = truth\n",
    "    return matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_matrix = set_feature_matrix(3,'train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {},
   "outputs": [],
   "source": [
    "h_train_matrix = set_feature_matrix(4,'train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {},
   "outputs": [],
   "source": [
    "g_train_matrix = set_feature_matrix(5,'train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "metadata": {},
   "outputs": [],
   "source": [
    "o_train_matrix = set_feature_matrix(6,'train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_matrix = set_feature_matrix(3,'test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {},
   "outputs": [],
   "source": [
    "h_test_matrix = set_feature_matrix(4,'test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [],
   "source": [
    "g_test_matrix = set_feature_matrix(5,'test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {},
   "outputs": [],
   "source": [
    "o_test_matrix = set_feature_matrix(6,'test')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 544,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics.pairwise import pairwise_distances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 547,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算预测值\n",
    "def predict(matrix, similarity, sim_type):\n",
    "    # 基于用户相似度\n",
    "    if sim_type == 'user':\n",
    "        mean_user_ratings = matrix.mean(axis=1)\n",
    "        # 减去每个用户评分平均值以消除不同用户不同评分习惯的影响\n",
    "        matrix_diff = (matrix - mean_user_ratings[:,np.newaxis])\n",
    "        # 预测时再加上平均分\n",
    "        pred = mean_user_ratings[:,np.newaxis] + similarity.dot(matrix_diff)/np.array([np.abs(similarity).sum(axis=1)]).T\n",
    "    # 基于物品相似度\n",
    "    elif sim_type == 'item':\n",
    "        pred = matrix.dot(similarity)/np.array([np.abs(similarity).sum(axis=1)])\n",
    "    return pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 959,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cf_model(train_matrix, test_matrix):\n",
    "    \n",
    "    user_similarity = pairwise_distances(train_matrix, metric='cosine')\n",
    "    item_similarity = pairwise_distances(train_matrix.T, metric='cosine')\n",
    "    \n",
    "    itembasedCF_prediction = predict(train_matrix,item_similarity,sim_type='item')  \n",
    "    userbasedCF_prediction = predict(train_matrix,user_similarity,sim_type='user')\n",
    "    \n",
    "    userbasedCF_rmse = rmse(userbasedCF_prediction,test_matrix)\n",
    "    itembasedCF_rmse = rmse(itembasedCF_prediction,test_matrix)\n",
    "    \n",
    "    userbasedCF_mae = mae(userbasedCF_prediction,test_matrix)\n",
    "    itembasedCF_mae = mae(itembasedCF_prediction,test_matrix)\n",
    "    \n",
    "    print(userbasedCF_rmse,itembasedCF_rmse,userbasedCF_mae,itembasedCF_mae)\n",
    "    \n",
    "    return userbasedCF_rmse,itembasedCF_rmse,userbasedCF_mae,itembasedCF_mae"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 869,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_similarity = pairwise_distances(y_train_matrix, metric='cosine')\n",
    "item_similarity = pairwise_distances(y_train_matrix.T, metric='cosine')\n",
    "    \n",
    "itembasedCF_prediction = predict(y_train_matrix,item_similarity,sim_type='item')  \n",
    "userbasedCF_prediction = predict(y_train_matrix,user_similarity,sim_type='user')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 960,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.192991703660741 4.201379681393346 4.123383410731135 4.131651455531737\n"
     ]
    }
   ],
   "source": [
    "y_userbasedCF_rmse,y_itembasedCF_rmse,y_userbasedCF_mae,y_itembasedCF_mae = cf_model(y_train_matrix, y_test_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 961,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.155206874338857 4.163583154291122 4.0777847729900705 4.085893193845808\n"
     ]
    }
   ],
   "source": [
    "h_userbasedCF_rmse,h_itembasedCF_rmse,h_userbasedCF_mae,h_itembasedCF_mae = cf_model(h_train_matrix, h_test_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 962,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.126270030776153 4.133617402638423 4.039725685778609 4.046975445460022\n"
     ]
    }
   ],
   "source": [
    "g_userbasedCF_rmse,g_itembasedCF_rmse,g_userbasedCF_mae,g_itembasedCF_mae=cf_model(g_train_matrix, g_test_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 963,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.167559487780348 4.175284173049426 4.082785649026784 4.090405512805971\n"
     ]
    }
   ],
   "source": [
    "o_userbasedCF_rmse,o_itembasedCF_rmse,o_userbasedCF_mae,o_itembasedCF_mae = cf_model(o_train_matrix, o_test_matrix)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### CF上各方面评分预测准确度对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 964,
   "metadata": {},
   "outputs": [],
   "source": [
    "userbasedCF_rmse=[y_userbasedCF_rmse,h_userbasedCF_rmse,g_userbasedCF_rmse,o_userbasedCF_rmse]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 965,
   "metadata": {},
   "outputs": [],
   "source": [
    "itembasedCF_rmse=[y_itembasedCF_rmse,h_itembasedCF_rmse,g_itembasedCF_rmse,o_itembasedCF_rmse]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 966,
   "metadata": {},
   "outputs": [],
   "source": [
    "userbasedCF_mae=[y_userbasedCF_mae,h_userbasedCF_mae,g_userbasedCF_mae,o_userbasedCF_mae]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 967,
   "metadata": {},
   "outputs": [],
   "source": [
    "itembasedCF_mae=[y_itembasedCF_mae,h_itembasedCF_mae,g_itembasedCF_mae,o_itembasedCF_mae]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 968,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_names=['总分','口味','环境','服务']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 969,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.arange(4)\n",
    "total_width,n = 0.6,2\n",
    "width = total_width/n\n",
    "x = x-width/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 970,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15697750c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(x,userbasedCF_rmse,width=width,label='userbased_RMSE')\n",
    "plt.bar(x+width,itembasedCF_rmse,width=width,label='itembased_RMSE')\n",
    "plt.xticks(x+width/2,rating_names)\n",
    "plt.ylabel('RMSE')\n",
    "plt.ylim([3.5,4.5])\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 971,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD7CAYAAABnoJM0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAF7RJREFUeJzt3X90VeWd7/H310AmKIgaKI4iCR0r4xiKxlzUYsMBRZiRwsIG5eJok1qoltE63lVNFW91BupMy1B/DOpwoXBv6w+qF8oVKkEpAbTgCIop2qqjwiUoiOHXlcAYw/f+sQ9piPkJ++QkeT6vtbLWPvs8Z5/v2Un25zzPs88+5u6IiEi4Tkp3ASIikl4KAhGRwCkIREQCpyAQEQmcgkBEJHAKAhGRwCkIREQCpyAQEQmcgkBEJHDd0l1Aa/Tp08dzc3PTXYaISKeyadOmT9y9b0vtOkUQ5ObmsnHjxnSXISLSqZjZtta009CQiEjgFAQiIoFTEIiIBK5TzBGISMdSU1NDZWUlhw8fTncpAmRlZdG/f3+6d+9+XI9XEIhIm1VWVtKrVy9yc3Mxs3SXEzR3p6qqisrKSgYOHHhc29DQkIi02eHDh8nOzlYIdABmRnZ29gn1zhQEInJcFAIdx4n+LjQ0JCInLLd0eazb2/pPV8e6PWmeegQiIoFTEIhI0O677z7Ky8tTsu2FCxeycOHCJp936NChAJSWlpJIJAA4cuQI2dnZbNu2rW4bAwcOJJFIkEgkWLFiRex1KghERNJky5YtHDlyhDfeeKNu3auvvsqBAwcoKyurW3fTTTdRXl5OeXk5Y8aMib0OBYGIdDr138UvXLiQxx57jLFjx1JYWMiECRP4/PPPqa6upqioiMLCQqZNm1b32EQiwQ9+8ANGjx5dt2727NkMHz6cSZMmUVtbS21tLZMnT2bYsGGMHz+empoa3J0bbriBwsJCrrjiCvbv34+7M2XKFIYPH05RURG1tbXU1NQwYcIERowYwZNPPtns68jNzeXdd9+lpqambt2KFSuYNm1aSt75N0VBICKdXnV1NSeddBJr166lpKSETz/9lLlz55KXl8fatWv56KOPqKioAGDDhg1cdtllx7zjLigoYM2aNfTu3ZvnnnuOqqoqrr76atasWcOpp57Ka6+9xp49e6ioqGDNmjXce++97N+/n6VLl1JTU8OaNWsYMGAAy5cvZ/HixeTk5LB69WpycnKarTs/P59Vq1Zx1lln1a1buXIld955J7///e/5/PPPAZg/f37d0NCOHTti338KAhHp1A4dOsQZZ5xBXl4eV111FWVlZZx88sm8/fbbLFmyhEQiwfvvv193AM3Ly+Oaa645ZhuXXHIJEB2Y33vvPbp3786yZcuYOHEi77//PocOHSI7O5vi4mLGjBnDggUL6NWrF2+//Tbr168nkUiwdu1adu3axQcffMCQIUOAKGCak5+fz8KFC7nooosA2Lt3L1u2bGHy5MkcOHCA9evXA8cODZ199tmx7j/Q6aMiEoP2Pt0zMzOT3bt3A9FQyogRIxg2bBg//vGPmTx5MuvWrWPQoEEMHTqUkpISli1bxoABAwDo2bPnF7a3adMmRo8eTUVFBSNHjmTx4sXk5eVx9913c9111wGwfft2srOzKSsr4+6772bx4sUMGjSISZMmcf/99/PSSy9hZmzbto3XXnsNgNdff51LL720ydeRl5fHG2+8wU9/+lOWLl3Kiy++yLe+9S0efvhh5s+fT1lZGeeee27cu+8L1CMQkU5n3LhxPPLII9x8881kZ2cD8PDDD/O1r32NnTt3UlBQwJQpU3j++ecpLCzk8ccf55xzzmlye+vWrWP48OHs2rWL8ePHM2zYMBYtWsTll1/Onj172LFjB2eeeSbPPfccw4YN47e//S1XXnkl48aN48MPP2T48OFMnz6dnJwcvvnNb/LOO++QSCR45513mn0dmZmZDB48uK5HUFZWxsiRIwEYOXJk3TxB/aGhhx56KI5deAxz99g3GreCggLXF9OIdBx/+MMfOP/889NdhtTT2O/EzDa5e/PjU6RoaMjM+gEr3P2iE2kjItIVTJo0iZ07dx6z7vnnn6dHjx5pquhYqZojmAW09Apb00ZEpNN7+umn011Cs2KfIzCzkcBBYOeJtBERkfYRaxCYWSZwL1B6Im2S7aaa2UYz23j07AAREYlf3ENDpcCj7r6vmcuitqYN7j4XmAvRZHHMdYpInO7rHfP29se7PWlW3ENDVwLTzKwcuNDM5h1nGxGRFt1+++3H3N68eTObN29u83aKi4vZunVrTFUdq7mL2hUXF3PttdcC0YRycXExAHv27KFXr151XzZz3333cf7559edQno8r7E5sQaBuxe6e8LdE8BmYLaZzWiujbt/J84aRCQcDz744DG3jzcI0unoBefqX3juhRde4PDhw6xdu7Zu3T333FP36eILL7ww1hpS9sni5IEeYHor2oiItFkikah7t/3DH/6QJUuWAPCLX/yCVatWUV1dzY033sjHH3/M4MGDmTNnDhdffDFf+tKXyMzMZOfOnZSUlABw1113UVlZydChQ/nZz37Gp59+SlFREQcPHuTcc89lwYIFHDp0iIkTJ3LgwAGys7N55pln+Oyzz77wHHv37mXixInU1tbi7nWXmG5MZmYmVVVVx3zxfP0Lz1111VUp239H6ZPFItIlPPDAA5SWllJaWsqqVasAGr3wXHV1Nc888wwVFRU8+eSTvPLKKwBcffXVvPzyy7z11lts3ryZjz76iFtvvZUXX3yRrVu3smvXLt56661WXdxu7ty5jB07ltWrVx9zgG/MkCFDWLRoUd31iQDWr1/P9OnT614HwMyZM+uGhmpra2PddwoCEemyGrvwXL9+/ejZsyc5OTlkZGRw9OoKjV14bt68eVx//fXs2bOHQ4cOkZ+f36qL2x3Phefy8/MBqKio4JNPPqGoqIitW7eyfft24NihoYyMjFj3k4JARLqMHj16UF1dDYC7M2jQIG6//XbKy8uZMWNG3YXnGrNp0yYgOhDn5uYyf/58ioqKeOqppzjllFOAaBx/2LBhrFy5kr1799Zd3K7hcwwYMIA333wToMU5i/z8fF599dW6IDh6Ubvy8nJuu+22Yy6XnSq6+qiInLgOcrrnqFGjuPbaa3niiSd44IEHmDJlCiUlJSxYsIBTTz212S+KefbZZ5kzZw4XXXQRF198MQcPHuR73/sejz/+OAA7duzgggsu4K677mLmzJlkZWVRUFDApZde+oXnmDp1KhMnTuTZZ5895ktnGpObm8t5551X990FZWVlzJo1C4guPDdnzhzy8vKYOXMm8+ZFJ1necsstdVdFjYMuOicibaaLznU8He6icyIicqyGZw717t2bpUuXpqeYBhQEIiLtoKkPlXUEmiwWkePSGYaVQ3GivwsFgYi0WVZWFlVVVQqDDsDdqaqqIisr67i3oaEhEWmz/v37U1lZia4M3DFkZWXRv3//4368gkBE2qx79+4MHDgw3WVITDQ0JCISOAWBiEjgFAQiIoFTEIiIBE5BICISOAWBiEjgFAQiIoFT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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156972c08d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(x,userbasedCF_mae,width=width,label='userbased_MAE')\n",
    "plt.bar(x+width,itembasedCF_mae,width=width,label='itembased_MAE')\n",
    "plt.xticks(x+width/2,rating_names)\n",
    "plt.ylim([3.5,4.5])\n",
    "plt.ylabel('MAE')\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 595,
   "metadata": {},
   "outputs": [],
   "source": [
    "def SGD(train_data,test_matrix,feature,eta,K,lambda_1,lambda_2,Step):\n",
    "    # train: train data\n",
    "    # test: test data\n",
    "    # N:the number of user\n",
    "    # M:the number of item\n",
    "    # eta: the learning rata\n",
    "    # K: the number of latent factor\n",
    "    # lambda_1,lambda_2: regularization parameters\n",
    "    # Step: the max iteration\n",
    "    \n",
    "    U = np.random.normal(0,0.1,(n_users,K))\n",
    "    V = np.random.normal(0,0.1,(n_items,K))\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    loss=[]\n",
    "    L=10000\n",
    "    \n",
    "    for ste in range(Step):\n",
    "        los =0.0\n",
    "        for line in train_data.itertuples():\n",
    "            i = int(np.argwhere(users==line[1]))\n",
    "            j = int(np.argwhere(items==line[2]))\n",
    "            r = line[feature]\n",
    "            \n",
    "            e = r-np.dot(U[i],V[j].T)\n",
    "            U[i] = U[i] + eta*(e*V[j]-lambda_1*U[i])\n",
    "            V[j] = V[j] + eta*(e*U[i]-lambda_2*V[j])\n",
    "\n",
    "            los=los+0.5*(e**2+lambda_1*np.square(U[i]).sum()+lambda_2*np.square(V[j]).sum())\n",
    "        \n",
    "        loss.append(los)\n",
    "        rms=rmse(np.dot(U,V.T),test_matrix)\n",
    "        ma=mae(np.dot(U,V.T),test_matrix)\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "#         if loss[-1]<L:\n",
    "#             break\n",
    "            \n",
    "    return loss,rmseList,maeList,U,V"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 596,
   "metadata": {},
   "outputs": [],
   "source": [
    "# PREDICT Y BY PMF\n",
    "loss,y_pmf_rmseList,y_pmf_maeList,Uy_pmf,V_pmf=SGD(train_data,y_test_matrix,3,0.005,10,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 882,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pmf_rmse = y_pmf_rmseList[-1]\n",
    "y_pmf_mae = y_pmf_maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 883,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.9678349881199685, 0.7221672331790052)"
      ]
     },
     "execution_count": 883,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pmf_rmse,y_pmf_mae"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 972,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156995dd4a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='loss-iterations',color='red')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 973,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156978874e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), y_pmf_rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), y_pmf_maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1456,
   "metadata": {},
   "outputs": [],
   "source": [
    "# PREDICT H BY PMF\n",
    "loss,h_pmf_rmseList,h_pmf_maeList,Uh_pmf,C_pmf=SGD(train_data,h_test_matrix,4,0.005,10,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1457,
   "metadata": {},
   "outputs": [],
   "source": [
    "h_pmf_rmse = h_pmf_rmseList[-1]\n",
    "h_pmf_mae = h_pmf_maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1458,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.1226740765706813, 0.827526001495533)"
      ]
     },
     "execution_count": 1458,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h_pmf_rmse,h_pmf_mae"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1459,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b284d78940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='loss-iterations',color='red')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1374,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b284c8a9e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), h_pmf_rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), h_pmf_maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1452,
   "metadata": {},
   "outputs": [],
   "source": [
    "# PREDICT G BY PMF\n",
    "loss,g_pmf_rmseList,g_pmf_maeList,Ug_pmf,E_pmf=SGD(train_data,g_test_matrix,5,0.005,10,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1453,
   "metadata": {},
   "outputs": [],
   "source": [
    "g_pmf_rmse = g_pmf_rmseList[-1]\n",
    "g_pmf_mae = g_pmf_maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1454,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b284a99a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='loss-iterations',color='red')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1455,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b284a8e898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), g_pmf_rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), g_pmf_maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1448,
   "metadata": {},
   "outputs": [],
   "source": [
    "# PREDICT O BY PMF\n",
    "loss,o_pmf_rmseList,o_pmf_maeList,Uo_pmf,S_pmf=SGD(train_data,o_test_matrix,6,0.005,10,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1449,
   "metadata": {},
   "outputs": [],
   "source": [
    "o_pmf_rmse = o_pmf_rmseList[-1]\n",
    "o_pmf_mae = o_pmf_maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1450,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b285380198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='loss-iterations',color='red')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1451,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b2844af2e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), o_pmf_rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), o_pmf_maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PMF上各方面评分预测准确度对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1383,
   "metadata": {},
   "outputs": [],
   "source": [
    "PMF_rmse=[y_pmf_rmse,h_pmf_rmse,g_pmf_rmse,o_pmf_rmse]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1384,
   "metadata": {},
   "outputs": [],
   "source": [
    "PMF_mae=[y_pmf_mae,h_pmf_mae,g_pmf_mae,o_pmf_mae]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1385,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b288423048>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(x,PMF_rmse,width=width,label='PMF_RMSE')\n",
    "plt.xticks(x,rating_names)\n",
    "plt.ylabel('RMSE')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1386,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b2883bfb38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(x,PMF_mae,width=width,label='PMF_MAE')\n",
    "plt.xticks(x,rating_names)\n",
    "plt.ylabel('MAE')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# NMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 976,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nmf_model(train_matrix,test_matrix,k,Step):\n",
    "    \n",
    "    V=train_matrix\n",
    "    \n",
    "    W= np.random.random((n_users,k))\n",
    "    H= np.random.random((k,n_items))\n",
    "    \n",
    "    minrms=100\n",
    "    minmae=100\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    \n",
    "    for s in range(Step):\n",
    "        V_pred = np.dot(W,H)\n",
    "        E=V-V_pred\n",
    "        err = 0.0\n",
    "\n",
    "        err = (E**2).sum()\n",
    "#         if err<10000:\n",
    "#             break\n",
    "        \n",
    "        a=np.dot(W.T,V)\n",
    "        b=np.dot(np.dot(W.T,W),H)\n",
    "        \n",
    "        for i_1 in range(k):\n",
    "            for j_1 in range(n_items):\n",
    "                if b[i_1,j_1] != 0:\n",
    "                    H[i_1,j_1] = H[i_1,j_1]* a[i_1,j_1] / b[i_1,j_1]\n",
    "        \n",
    "        c=np.dot(V,H.T)\n",
    "        d=np.dot(np.dot(W,H),H.T)\n",
    "        for i_2 in range(n_users):\n",
    "            for j_2 in range(k):\n",
    "                if d[i_2, j_2] != 0:\n",
    "                    W[i_2,j_2] = W[i_2,j_2] * c[i_2,j_2] / d[i_2, j_2]\n",
    "        \n",
    "        rms=rmse(np.dot(W,H),test_matrix)\n",
    "        ma=mae(np.dot(W,H),test_matrix)\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "        if rms<minrms:\n",
    "            minrms=rms \n",
    "            best_W = W\n",
    "            best_H = H\n",
    "        if ma<minmae:\n",
    "            minmae=ma\n",
    "            \n",
    "    print(minrms,minmae)\n",
    "        \n",
    "#     show(Step,rmseList,maeList)    \n",
    "           \n",
    "    return best_W,best_H,rmseList,maeList\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 977,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.017898168299264 3.9102882129330307\n"
     ]
    }
   ],
   "source": [
    "Wy,Hy,rmseList,maeList=nmf_model(y_train_matrix,y_test_matrix,10,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 984,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEGCAYAAAB2EqL0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8VPW97//XJzcICXI3iJR7sF4QxGwFQUxRFFBra1ttj1vFem3p7tm7j4cWqm6VosVWPfbn79hT1EprrZfds0WtFe9RVKgGBaTesDUqCIjhooEAuXzOH2tNMoSZySTMZELm/Xw81mPWfOe71vqsBOaT71rr+/2auyMiItKanEwHICIiBwYlDBERSYoShoiIJEUJQ0REkqKEISIiSVHCEBGRpChhiIhIUpQwREQkKUoYIiKSlLxMB5BK/fv392HDhmU6DBGRA8qKFSs+d/cBrdXrUglj2LBhVFZWZjoMEZEDipl9lEw9XZISEZGkKGGIiEhSlDBERCQpXeoehoh0jLq6OtatW8euXbsyHYq0Qffu3Rk8eDD5+fnt2l4JQ0TabN26dfTs2ZNhw4ZhZpkOR5Lg7lRXV7Nu3TqGDx/ern3okpSItNmuXbvo16+fksUBxMzo16/ffrUKlTBEpF2ULA48+/s7U8IAPv4Yrr0W/vGPTEciItJ5KWEA27bB/PmwYkWmIxGRZM2aNYtjjjmGiRMn8p3vfIdJkyZx1VVXATBhwgSuv/56NmzYwGmnncYJJ5zAnDlz9tquvLyc8vJyNm7cGPcYK1euZNGiRXuVLV68mG3btqXsPGLtL9ZxOwMlDGDEiOBVLQyRA8sdd9zBsmXLKC4upr6+nlWrVtHY2MiaNWsA+PWvf83FF1/Mq6++ysqVK5uSwx133EFFRQUVFRUMHDgw7v7HjRvHrFmz9irriIQR67idgZ6SAoqLoaRECUOkPf7932HlytTuc9w4uP325Oq6OzU1NRQUFFBfX88HH3zAkCFDADj00EP54x//yOTJk1myZEmb44gkleuvvx6AGTNm8Oabb/Luu+8yadIkbr31Vt5//30uv/xydu7cyezZs7nggguoqKjg0UcfpaqqiiOOOIIbb7yRt956i4svvpj8/HzOO+88fvjDH8bcX6zjfvjhh1xyySXU1tbyzW9+kyuvvJLy8nJOP/10HnnkEfr378+jjz7Ke++9xyWXXEJ9fT2nn3461157bZvPORG1MEKjRsEHH2Q6ChFpi3/7t39j2LBhlJSUkJOTw6BBg3j22Wc59thjAfjRj37EjBkzKC8v56abbtpru/Lycr7zne9QW1vbdHkqsjz22GMxj/fkk08yffp0HnzwwaYv96uuuorrrruOpUuXcvPNN+PuADz88MP86le/4sYbbwRg06ZN/O53v+Oxxx7j3nvvjbu/WK688krmzZvHK6+8wlNPPcU777wDQFFREa+++io1NTVs2LCBJ554grPPPpvly5eTjoFY1cIIjRwJzz+f6ShEDjzJtgTS4Y477uDll1+mW7durFmzhmOOOYZFixbxve99j+3bt7NmzRouvvhiZs2axfTp05k0aVLTdpMnT27aT0VFRbtjeO+997juuuswMxoaGpouL33ve99j1KhRTfXcnauuuor+/ftTX1/fpmO88847HH/88ZgZZWVlvPvuuwBceOGFAAwZMoQ9e/Zw/vnnc9VVVzFt2jTOOuusdp9TPGphhEaOhPXrQR1XRQ4sl19+Offccw8NDQ2MHz+eVatWcdRRRwEwf/58li1bRmFhIaNHj05Jz/TCwkJ27tzZ9P6www5j0aJFVFRU8KMf/YiCggIAiouL99pu3rx53HXXXfzyl7+koaEh7v5iOeKII1i+fDnuzuuvv87hhx8OBC2MaBUVFVx99dUsWbKEX/3qV9TV1e3XubaUtoRhZiVm9mYrny+Nep9vZo+b2Stm9v14ZekyciS4w4cfpvMoIpJqffr0YerUqVRXVzN+/HiOPvropqEvrr32WubOnctJJ51EXV0d06ZNA5ovSZWXl/Piiy+26XgXXHABl156Kccddxy1tbUsWLCASy+9lAkTJvDhhx/u8yUecfbZZzNz5kwuvvhi6urqmpJXy/3F8stf/pL//M//5IQTTmD69Ol89atfjVlvxIgRXHjhhZxwwgnMmDGj3UOAxGOR622pZmb3Af/i7vucmZn1AR4ADnb38WHZT4CD3P16M/srcC5wacsyd/8y3jHLysq8vfNh/O1vMGECPPYYnHlmu3YhkjXeeeedpr9y5cAS63dnZivcvay1bdPSwjCzqcAOIN4Dzg0ECeGLqLJy4OFw/SWgLE5Zy2NdZmaVZla5efPmdsc8cmTwqielRERiS3nCMLMC4FpgTrw6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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156972c2128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show(100,rmseList,maeList)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# BNMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 286,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pnn(array):\n",
    "    array[array<0]=0\n",
    "    return array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 979,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bnmf(train_matrix,test_matrix,Step,K,sigma2):\n",
    "    rmseList=np.zeros(Step)\n",
    "    maeList=np.zeros(Step)\n",
    "    \n",
    "    alpha=0.00001\n",
    "    beta=0.00001\n",
    "    \n",
    "    minrms=100\n",
    "    minmae=100\n",
    "    \n",
    "    I = n_users\n",
    "    J = n_items\n",
    "    \n",
    "    U = np.random.exponential(alpha,(I,K))\n",
    "    V = np.random.exponential(beta,(K,J))\n",
    "    \n",
    "    \n",
    "    Y = train_matrix\n",
    "    \n",
    "    for ste in range(Step): \n",
    "        \n",
    "        C = np.dot(V,V.T)\n",
    "        D = np.dot(Y,V.T)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if C[k,k]!=0:\n",
    "                unk = np.concatenate((U[:,:k],U[:,k+1:]),axis=1)\n",
    "                cnk = np.concatenate((C[:k,k],C[k+1:,k]),axis=0)\n",
    "                an = (D[:,k] - np.dot(unk,cnk) -alpha*sigma2)/(C[k,k])\n",
    "                U[:,k] = pnn(an)\n",
    "        \n",
    "        chi = np.square(Y).sum()/2\n",
    "        xi = (U*(np.dot(U,C)-2*D)).sum()/2\n",
    "            \n",
    "        sigma2 =(chi+xi+1)/(0.5*I*J)\n",
    "        \n",
    "        E = np.dot(U.T,U)\n",
    "        F = np.dot(U.T,Y)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if E[k,k]!=0:\n",
    "                vnk = np.concatenate((V[:k,:],V[k+1:,:]),axis=0)\n",
    "                enk = np.concatenate((E[k,:k],E[k,k+1:]))\n",
    "            \n",
    "                bn = (F[k,:] - np.dot(enk,vnk) -beta*sigma2)/(E[k,k])\n",
    "                V[k] = pnn(bn)\n",
    "           \n",
    "        rms=rmse(np.dot(U,V),test_matrix)\n",
    "        ma=mae(np.dot(U,V),test_matrix)\n",
    "        rmseList[ste] = rms\n",
    "        maeList[ste] = ma\n",
    "        \n",
    "        if rms<minrms:\n",
    "            minrms=rms \n",
    "            best_U = U\n",
    "            best_V = V\n",
    "        if ma<minmae:\n",
    "            minmae=ma\n",
    "            \n",
    "    print(minrms,minmae)\n",
    "        \n",
    "#     show(Step,rmseList,maeList)    \n",
    "           \n",
    "    return best_U,best_V,rmseList,maeList"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 980,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.014133155825726 3.9046839725448694\n"
     ]
    }
   ],
   "source": [
    "Uy_bnmf,Vy_bnmf,rmseList,maeList = bnmf(y_train_matrix,y_test_matrix,100,10,1.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 985,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEGCAYAAAB2EqL0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8VPW97//XJzcICXI3iJR7sF4QxGwFQUxRFFBra1ttj1vFem3p7tm7j4cWqm6VosVWPfbn79hT1EprrZfds0WtFe9RVKgGBaTesDUqCIjhooEAuXzOH2tNMoSZySTMZELm/Xw81mPWfOe71vqsBOaT71rr+/2auyMiItKanEwHICIiBwYlDBERSYoShoiIJEUJQ0REkqKEISIiSVHCEBGRpChhiIhIUpQwREQkKUoYIiKSlLxMB5BK/fv392HDhmU6DBGRA8qKFSs+d/cBrdXrUglj2LBhVFZWZjoMEZEDipl9lEw9XZISEZGkKGGIiEhSlDBERCQpXeoehoh0jLq6OtatW8euXbsyHYq0Qffu3Rk8eDD5+fnt2l4JQ0TabN26dfTs2ZNhw4ZhZpkOR5Lg7lRXV7Nu3TqGDx/ern3okpSItNmuXbvo16+fksUBxMzo16/ffrUKlTBEpF2ULA48+/s7U8IAPv4Yrr0W/vGPTEciItJ5KWEA27bB/PmwYkWmIxGRZM2aNYtjjjmGiRMn8p3vfIdJkyZx1VVXATBhwgSuv/56NmzYwGmnncYJJ5zAnDlz9tquvLyc8vJyNm7cGPcYK1euZNGiRXuVLV68mG3btqXsPGLtL9ZxOwMlDGDEiOBVLQyRA8sdd9zBsmXLKC4upr6+nlWrVtHY2MiaNWsA+PWvf83FF1/Mq6++ysqVK5uSwx133EFFRQUVFRUMHDgw7v7HjRvHrFmz9irriIQR67idgZ6SAoqLoaRECUOkPf7932HlytTuc9w4uP325Oq6OzU1NRQUFFBfX88HH3zAkCFDADj00EP54x//yOTJk1myZEmb44gkleuvvx6AGTNm8Oabb/Luu+8yadIkbr31Vt5//30uv/xydu7cyezZs7nggguoqKjg0UcfpaqqiiOOOIIbb7yRt956i4svvpj8/HzOO+88fvjDH8bcX6zjfvjhh1xyySXU1tbyzW9+kyuvvJLy8nJOP/10HnnkEfr378+jjz7Ke++9xyWXXEJ9fT2nn3461157bZvPORG1MEKjRsEHH2Q6ChFpi3/7t39j2LBhlJSUkJOTw6BBg3j22Wc59thjAfjRj37EjBkzKC8v56abbtpru/Lycr7zne9QW1vbdHkqsjz22GMxj/fkk08yffp0HnzwwaYv96uuuorrrruOpUuXcvPNN+PuADz88MP86le/4sYbbwRg06ZN/O53v+Oxxx7j3nvvjbu/WK688krmzZvHK6+8wlNPPcU777wDQFFREa+++io1NTVs2LCBJ554grPPPpvly5eTjoFY1cIIjRwJzz+f6ShEDjzJtgTS4Y477uDll1+mW7durFmzhmOOOYZFixbxve99j+3bt7NmzRouvvhiZs2axfTp05k0aVLTdpMnT27aT0VFRbtjeO+997juuuswMxoaGpouL33ve99j1KhRTfXcnauuuor+/ftTX1/fpmO88847HH/88ZgZZWVlvPvuuwBceOGFAAwZMoQ9e/Zw/vnnc9VVVzFt2jTOOuusdp9TPGphhEaOhPXrQR1XRQ4sl19+Offccw8NDQ2MHz+eVatWcdRRRwEwf/58li1bRmFhIaNHj05Jz/TCwkJ27tzZ9P6www5j0aJFVFRU8KMf/YiCggIAiouL99pu3rx53HXXXfzyl7+koaEh7v5iOeKII1i+fDnuzuuvv87hhx8OBC2MaBUVFVx99dUsWbKEX/3qV9TV1e3XubaUtoRhZiVm9mYrny+Nep9vZo+b2Stm9v14ZekyciS4w4cfpvMoIpJqffr0YerUqVRXVzN+/HiOPvropqEvrr32WubOnctJJ51EXV0d06ZNA5ovSZWXl/Piiy+26XgXXHABl156Kccddxy1tbUsWLCASy+9lAkTJvDhhx/u8yUecfbZZzNz5kwuvvhi6urqmpJXy/3F8stf/pL//M//5IQTTmD69Ol89atfjVlvxIgRXHjhhZxwwgnMmDGj3UOAxGOR622pZmb3Af/i7vucmZn1AR4ADnb38WHZT4CD3P16M/srcC5wacsyd/8y3jHLysq8vfNh/O1vMGECPPYYnHlmu3YhkjXeeeedpr9y5cAS63dnZivcvay1bdPSwjCzqcAOIN4Dzg0ECeGLqLJy4OFw/SWgLE5Zy2NdZmaVZla5efPmdsc8cmTwqielRERiS3nCMLMC4FpgTrw67v6Fu29vUVwErA/XtwAlccpa7muhu5e5e9mAAa3OMBhXv35w0EFKGCIi8aSjhTEHuNPd29qzpQYoDNeLCWKLVZYWZkErQwlDRCS2dHwBnwLMNrMKYJyZ3Z3kdiuAyHNuY4GqOGVpo74YIiLxpbwfhrtPiayHSeM2M5vv7te0sunvgb+a2YnAEcDfCC5HtSxLm5EjYfFiaGiA3Nx0HklE5MCT1n4Y7l7u7m/HSxbuXh61/hEwDXgFOMXdG2KVpTPekSOhrg4++SSdRxGRVJg1axbnnHMOAN/97neZNWsWW7ZsoWfPnk2PrF5//fUcfvjhTY/QrkwwhsnGjRtZsGDBXmUVFRVUVVWlLOZY+4t13M6qU3Xcc/dP3f3h6BviscrSJdIpU/cxRA4Mq1at2uv1mWeeYdeuXbz00ktNda6++uqmsZnGjRsXd18DBw5sGtE2oiMSRqzjdlYaGiRK5NHaDz6Ak0/ObCwiB4p/X/LvrNyY2tEHxw0cx+3TWx9zpKCggOrq6qYOakuWLGH27NksWbKEU089tU3HrKqq4vrrr28aVvyiiy7ihRdeYPHixRx55JHcf//9bNq0iVmzZrF9+3bOPPNM5s6dS1VVFVdffXVTD+97772XTz/9lHPOOQczY8qUKdx4440x9xfruFu2bOHCCy9k27ZtHHvssdx+++3MmjWLESNG8Mwzz9DQ0MBzzz3Hl19+ybnnnktdXR1HHnkkv/3tb9t0vu3RqVoYmXboodCtm1oYIgeKsWPH8tBDDzF27FgAli1bxjXXXMNzzz3XVOfGG29suiTV0NDAWWedtddAgwsXLoy573vvvZdZs2Zx++23N325/+IXv+Dcc8/l1VdfZfHixVRXVwPw+OOPc/nllzcNKrh+/XoWLFjAk08+yeOPPx53f7HcdNNNfPe732Xp0qVs3769aZTdmpoali5dyle/+lXefPNNli5dypgxY3j55ZeZMmUKjY2N+/nTbJ1aGFFycmD4cCUMkbZIpiWQLuPHj28abHDp0qV8/vnnfPvb36aqqopPwpuRV199Nf/6r//atM2jjz7a7uO99957LFu2jEWLFrFjxw4+/fRTevbsyamnnsqECROa6uXl5XHDDTdQXFzMl1/GHZwiprfffpsrrrgCgOOPP75pZNqWAw3OmDGD559/nmnTpjFhwgRyctL/979aGC3o0VqRA8f48eN5/fXXGT9+PE899RQ/+9nPqKio4Mc//jFPPfXUfu8/emBAd+ewww5jwYIFVFRUMGfOHPr27QvsO9Dgbbfdxty5c7n77rv3mke75f5iOfLII1m+fDkAy5cv58gjjwT2HWhw2bJlnH/++TzzzDM8//zz/KMD/tJVwmgh0nkvTUNsiUgKDRs2jNGjRzN06FAmTpzI1KlTAZg6dWrTpZzoS1IPPfRQm/b/rW99iwULFjBhwgT+8Y9/MGfOHG655RYmTZrEkiVLKCnZZ/AJAM444wyuuOIKvv71r9OjRw/Wr18fc3+xzJ07lwcffJDJkyfTu3fvuPdiRowYwVVXXcXEiRM5+OCDGTp0aJvOrT3SNvhgJuzP4IMRd9wBP/4xbNwYzMInIvvS4IMHrk43+OCBTIMQiojEpoTRQqQvhu5jiCTWla5OZIv9/Z0pYbQwbFjwtJRaGCLxde/enerqaiWNA4i7U11dTffu3du9Dz1W20JBAQwdqhaGSCKDBw9m3bp17M8cNNLxunfvzuDBg9u9vRJGDHq0ViSx/Px8hg8fnukwpIPpklQMShgiIvtSwohh5EjYsiVYREQkoIQRg0atFRHZlxJGDHq0VkRkX2lJGGZWYmZvJvj8HjNbZmbXhO9/YGYV4bLSzH5rZnlm9nFU+Zh0xBrLiBHBqxKGiEizdLUwbgEKY31gZmcDue4+ERhhZqXu/ptwdr5yYClwF3A08ECk3N3fSlOs+ygshMGDdUlKRCRayhOGmU0FdgAb41QpBx4O158GJkdteyhQ4u6VwATgDDN7LWyRxHwE2MwuM7NKM6tM5TPhelJKRGRvKU0YZlYAXAskmm+wCFgfrm8Boof4mw38Jlx/nWAe7+OAfGBmrJ25+0J3L3P3sgEDBuxP+HtRwhAR2VuqWxhzgDvdfVuCOjU0X64qjsRgZjnA14CK8LPV7r4hXK8ESlMca0KjRsGmTdDGuU9ERLqsVCeMU4DZZlYBjDOzu2PUWUHzZaixQFW4fiLwN28enOY+MxtrZrnAN4BVKY41IT1aKyKyt5QODeLuUyLrYdK4zczmu/s1UdUWA0vNbBAwg+BeBcBpwEtR9eYBfwIMeMzdn01lrK2JfrR23LiOPLKISOeUtrGkwieeAK5pUf6FmZUD04Bfuvv2sPxnLeqtIXhSKiMi82LoPoaISCAjgw+6+1aan5TqlIqLgxn3lDBERALq6Z2AnpQSEWmmhJHAqFG66S0iEqGEkcCoUbBuHdTWZjoSEZHMU8JIIPKk1D//mdk4REQ6AyWMBDRqrYhIMyWMBCIJ4913MxuHiEhnoISRQO/eMHw4vPFGpiMREck8JYxWlJVBZWWmoxARyTwljFaUlQU3vTW/t4hkOyWMVpSVBa8rVmQ2DhGRTFPCaMX48cGrLkuJSLZTwmhF795QWqqEISKihJGEY49VwhARUcJIQlkZfPwxpHDKcBGRA44SRhJ041tEJE0Jw8xKzOzNBJ/fY2bLzOya8H2emX1sZhXhMiYsv8HMXjez/52OOJN1zDFgpstSIpLd0tXCuAUojPWBmZ0N5Lr7RGCEmZUSzKz3gLuXh8tbZnYswdzfxwGfmdkpaYq1VQcdBIcdpoQhItkt5QnDzKYCO4CNcaqU0zzb3tMESWECcIaZvRa2PvKAk4D/6+4OPAWcmOpY20I9vkUk26U0YZhZAXAtMCdBtSJgfbi+BSgBXgdOcffjgHxgZpx6sY55mZlVmlnl5jTelS4rg/XrYcOGtB1CRKRTS3ULYw5wp7tvS1CnhubLVcVhDKvdPfJVXAmUxqm3D3df6O5l7l42YMCA/Y0/rmOPDV5141tEslWqE8YpwGwzqwDGmdndMeqsILgMBTAWqALuM7OxZpYLfANYFadexhxzDOTkwGuvZTIKEZHMyUvlztx9SmQ9TBq3mdl8d78mqtpiYKmZDQJmENy/WA38CTDgMXd/1sxygF+Y2a+B6eGSMUVFQSvjhRcyGYWISOakrR9G+LTT2y2SBe7+BcGN7+XA19x9u7uvcfej3X2Mu18d1mskaLEsBWa4+4fpijVZJ58My5dDTU2mIxER6XgZ6bjn7lvd/WF3j/ckVaRerbv/2d07xazaU6dCfT0sXZrpSEREOp56erfBpElQUADPPZfpSEREOp4SRhv06AEnnKCEISLZSQmjjU4+GVauhM8/z3QkIiIdSwmjjaZODV4rKjIahohIh1PCaKN/+RcoLtZlKRHJPkoYbZSfDyedpIQhItlHCQPYWbeTFZ+uYNuuRCOaNDv5ZFi7Fj75JM2BiYh0Im1OGOFw5F3K6k2rKburjFc/eTWp+pH7GGpliEg2iZswzOz5qPVfR33027RGlAEDiwcCsLEmYT/CJmPGQEkJLF6czqhERDqXRC0Mi1ofE6e8SygpCkZO31SzKan6OTkwaxY8/jisW5fGwEREOpFECaPAzA4xs0OBblHrBR0UW4cpzC+kV7deSbcwAC6/HNxh4cI0BiYi0okkShh7gPuBP4brfwrXd3dAXB2upLiEjTuSTxjDh8PMmXDXXbBnTxoDExHpJOIOb+7uX2tZZmYjgdPSGlGGDCwe2KYWBsAPfwinnx7cyzjnnDQFJiLSSSR8SsrMepjZGWb2/5vZu8DvgPRNa5dB7UkYp50WtDTuvDNNQYmIdCKtPSW1CTgDeBL4zN1PcvcbOiq4jjSwaGDSN70jcnPhiivgxRfh739PU2AiIp1EohbGrwnuWUwCZgMDzWxsMjs1sxIzezPB5/eY2TIzuyZ838vMnjSzp83sETMrMLM8M/vYzCrCZUy8/aVCSXEJ23dvp7autk3bff/70K0b3HJLmgITEekk4iYMd3/U3X/g7mOA/wncAdxoZh8lsd9bgMJYH5jZ2UCuu08ERoQdAc8DbnP3U4GNBNOxHg08EM7cV+7ub7XpzNoo0hdj0462tTL694cf/xgWLYJHH01DYCIinUTcm95mdkGLou3AfwGPJdqhmU0FdhB88cdSDjwcrj8NTHb36LsAA4DPCOb6PsPMvga8BVzu7vWJjr0/ojvvDes9rE3b/vzn8OyzQWtj9Wo49NA0BCgikmGJLkndDCwCrgJOBvoADuyKt4GZFQDXAnMS7LcIWB+ubwFKorafCPRx9+XA68Ap7n4ckA/MjHPMy8ys0swqN2/enOCwiTW1MNp4HwOCS1IPPAC7dsH550NDQ7vDEBHptBJdkjqE4Mv8P4C/A98DrgfOTLC/OcCd7p5oFL8ami9XFUdiMLO+BJe9vh9+ttrdN4TrlUDMMazcfaG7l7l72YAB7X+Aq63Dg7R02GFwxx3wwgvw059CXV27QxER6ZQSXZK6AhgLDAcagOXAG8CKBPs7BZhqZrOBcWZ2t7tf0qLOCmByuL+xwHthy+S/gLnuHrlHcp+Z3QisAb4B3NTWk2uLAT2CZNPehAFw0UWwbBnceissWRI8bjtlSqoiFJFMcN97iVUWXd5yu1jlydaJ/jxRHQiudPTu3b5zTFbchAH8NHz9GGgk+HIfC8wCpsbawN2bvh7NrAK4zczmu/s1UdUWA0vNbBAwg+BexcXAeOBqM7sa+A0wj6B3uQGPufuzbT25tsjPzad/j/77lTDMgp7fZ54Z3Ag/6SSYPh1OPBGOPx5Gjw7qANTWwsaNsGEDbNoEmzcH075u3Rr0HN+zBxobg8maDjooWPr3h4MPhgEDgtfIenFx837TpaEhuOQWWXbv3vt1167muOvqmpf6+n1fGxqC18bGYL2xMVgi/zmi11v+h2n5846cd2TdLBjrKzc3WHJympfc3ObPo19b7qOlRP+RE32BtPbZ/iwtf0bxfn6R9ejXlmXxyluWtefzRK/xftdtPff9rZfod3cgOfdcePDB9B7DPAM/GTPrA0wDXnL39n9Dt1BWVuaVlZXt3n7Mb8Ywqu8oHjn3kf2OZedOWLAAHnoI3n+/9fpm0K8f9OkT/KWQnx98odXUwJdfwrZtwT5jyc0NEkqvXlBUBN27Q2EhFBQEn+XlNX8RtvyCiP4i37MnSACR1127gsS2a1fwebpFf+FHJ4BYX+SxvpBh7y+uA1ms80/084kua7ke/T6SNBPV29/1ePtsLdZkl2S2ac9+4y2xfh/xfkeR8pa/x1jlydZp+e8/Xp1Ro2DatPb+e7MV7l7WWr1ELYy0cfetND8p1WkMLG575714evSAefOCZetWeO01+Pjj5l9wt24wcGDz0rdv8J85kZ07g5bIZ5/t/bptG2zfHiw7dwZf8rW1wRd/ff2+X/Yt/+ru1i1INPn5wXpkKSwMkk9kvbAwWI+UtaxTUBAs+fnNS17e3uuRpWULINUtJPeg9RJ5jazHas1E6rdsSSTzn7S1L5DWPmstMYp0JhlJGJ3VwOKBvPLxKynfb58+wTAi+6tHDxg6NFgkMbMgMUGQrERk/2mK1iglRSVsrNlIJi7TiYh0dkoYUQYWD6S2vpYv93yZ6VBERDodJYwo+9N5T0Skq0s0Wu0LZva8mb1tZp+b2StmttnM3unIADvS/nbeExHpylqdQMnM/gIc5+41ZlYE/Lmjgutokbm9lTBERPaVzCWpgcDwcH0oXXQCJVALQ0QkkWQeq70cuNnMhhH0+p6dzoAyqV+PfuRarhKGiEgMrSYMd19hZhcDBZGi9IaUOTmWQ0lxSZvnxBARyQatJgwzW0wwquzHgBEkjO8n3OgA1p65vUVEskEyl6QGuPuktEfSSUQ674mIyN6Suen9iJldbmYxp1ztatTCEBGJLZkWxunh63ctGBnN3T3m8OZdwcDigWzasYlGbyTH1K9RRCQimZveX4t+b2bd0hdO5g0sHkh9Yz1ba7fSr0e/TIcjItJpJHPT+wrgorBubvh6VJrjypjozntKGCIizZK55nIewcx4a4DTgKp0BpRp6rwnIhJbMgmjgKC3d7+w/uDWNjCzEjN7M8Hn95jZMjO7pq1l6RZJGBtqNnTUIUVEDgjJJIyLgUOA24GHgHuT2OYWIOZTVWZ2NpDr7hOBEWZWmmxZEsfdb4f0PARQC0NEpKVkbnqvIbgcBfBsa/XNbCqwA4j3jVtO8/SsTwOTgWOSLFsb43iXAZcBDBkypLXwWtWzoCdF+UV8+uWn+70vEZGuJKXPjZpZAXAtMCdBtSJgfbi+BShpQ9k+3H2hu5e5e9mAAfs/LqKZMajnICUMEZEWUt3RYA5wp7tvS1CnhubLVcVhDMmWdQglDBGRfaX6S/gUYLaZVQDjzOzuGHVWEFxeAhhL8NRVsmUdQglDRGRfyfT0Tpq7T4msh0njNjOb7+7RTzktBpaa2SCCx3UnEAxomExZh4gkDHcn7N0uIpL1Ek3RenCc8hOT2bG7l7v72y2SBe7+BcGN7+XA19x9e7JlyRw3FQb1HERtfS1f7P6iow4pItLpJbok9WBkxcweiiq/YX8P6u5b3f1hd9/Y1rKOcEhx8GitLkuJiDRLlDCir8XEbG10VYN6DgKUMEREoiW6h9HLzCYSJJWDzOwEgiTSq0MiyyAlDBGRfSVKGKsIO8QBq4FLo9a7tEhvbyUMEZFmcROGu19kZge7+2cAZjYF6Obuz3RYdBlSXFDMQd0OUsIQEYmS6Cmpm4BF4focYB7wHTP7XceEllmDeg7SAIQiIlESXZKa4u6TzewQgvkwjnb33Wb2QgfFllHqvCcisrdET0nVmNm3gd8A/wtoCC9LFXRIZBl2SPEhShgiIlESJYxZwLHAM+7+f4CvAj+g+eZ3lxbd21tERBInjMuAWqCfmf0ncDbwLvDtjggs0wb1HMTuht1s3bU106GIiHQKie5hzASOBD4GKoE3CObFqOuAuDIuui9G38K+GY5GRCTz4rYw3H0CcBDwDYLxnP4H8ATwq44JLbPUeU9EZG9xWxhmtoBgWPE84FPgAeBKgpZGlxdJGBu+1KO1IiKQ+JLU8VHrQ8LlLIJhx6emM6jOQAMQiojsLVHCmEYwIdJud38BwMxygG+1tlMz60vwhNWb7v55KgLtaIX5hfTu3lsJQ0QklOgpqfuBc4AfmNn/Z2b/k2B8qUmJdmhmfYC/AMcBL5jZPhNtm9lwM3vCzJaa2a1h2Q/MrCJcVprZb80sz8w+jiof094TbY9BPQfxaY0ShogIJG5hfMXdT7BgyrkPgTuBE1uZrxvgaOAn7r48TB7jgada1LkZ+HlY5yEzK3f33xB0EsTM7gB+H+7rAXf/adtPbf+pt7eISLNELYzu4fDmE4EtwMvAEeEw53G5+4thIphC0MpYFqPaaJpvnn9G1JDpZnYoUOLulQTTsp5hZq+Z2T1mltIpZVujhCEi0izZ4c1X0dzD24FXE+00bJWcC2wldr+NPwPXmdlyYDowN+qz2YQtDeB14BR332BmfyDoG/JYi2NdFolzyJAhicJqs0HFg9jw5QbN7S0iQivDm7d3px6MpzHbzH4OfB14qMXn881sMsFjur939xpouqn+NeDqsOpqd98drlcCpTGOtRBYCFBWVpbScTwG9RxEXWMd1bXV9O/RP5W7FhE54CS6JNUuZvZTM7sgfNsbiHfPYyXBo7q3RZWdCPzNmwdwus/MxppZLkEHwlWpjjcRTaQkItIs5QmD4K/9883sJSAXWGdm82PUuxK4zd13RpWdBrwU9X4ecB9Bclnm7s+mId641NtbRKRZym8iu/tWgj4c0a6JUe+6GGU/a/F+DcGTUhmhhCEi0iwdLYwuY1DPQeRYDlXbqjIdiohIxilhJFCQW8DQXkNZu2VtpkMREck4JYxWlPYrZW21EoaIiBJGK0r7lrJ2y1rNvCciWU8JoxWlfUv5YvcXbN65OdOhiIhklBJGK0r7BX0FdVlKRLKdEkYrSvuGCUM3vkUkyylhtGJY72HkWq5aGCKS9ZQwWpGfm8/wPsPVwhCRrKeEkYTIk1IiItlMCSMJpX2Dvhh6tFZEspkSRhJK+5Wyo24HG2s2ZjoUEZGMUcJIwuh+owE9KSUi2U0JIwlNj9bqSSkRyWJKGEkY0msIBbkFvF/9fqZDERHJGCWMJOTm5DKizwhdkhKRrJaWhGFmfc1smpl1mYmw9WitiGS7dMzp3Qf4C3Ac8IKZDYhRZ7iZPWFmS83s1rAsz8w+NrOKcBkTlt9gZq+b2f9OdaxtUdq3lA+2fECjN2YyDBGRjElHC+No4CfufiPwFDA+Rp2bgZ+7+4nAYDMrD7d7wN3Lw+UtMzsWmEyQfD4zs1PSEG9SSvuVsqt+F+u/WJ+pEEREMirlCcPdX3T35WY2heCLflmMaqOBN8L1z4BewATgDDN7zczuMbM84CTg/3rQY+4p4MRUx5ssDUIoItkuXfcwDDgX2ArUxajyZ+A6MzsTmA48B7wOnOLuxwH5wEygCIj8Sb8FKIlxrMvMrNLMKjdvTt+cFRrmXESyXVoShgdmA6uBr8f4fD7wJHAJ8Ht3rwFWu/uGsEolUArUAIVhWXGseN19obuXuXvZgAH73C5JmcEHDaYwr5B3Pn8nbccQEenM0nHT+6dmdkH4tjewLU7VlcAQ4LauhRxvAAAN50lEQVTw/X1mNtbMcoFvAKuAFQT3MADGAlWpjjdZOZbD0SVHs2rTqkyFICKSUeloYSwEzjezl4BcYJ2ZzY9R70rgNnffGb6fB9xHkEiWufuzwMvAMWb2a2AO8EAa4k3a2JKxrNq4SoMQikhWykv1Dt19KzCtRfE1Mepd1+L9GoInpaLLGsMno04Hfu3uH6Y43DYZN3AcC99YyCdffMKQXkMyGYqISIfr9D293b3W3f/s7v/MdCzjBo4DYOXGlRmORESk43X6hNGZjCkZg2FKGCKSlZQw2qC4oJjSfqVKGCKSlZQw2mjcwHFKGCKSlZQw2mhsyVg+3PYh23dtz3QoIiIdSgmjjSI3vldvWp3hSEREOpYSRhvpSSkRyVZKGG10SPEhDOgxQAlDRLKOEkYbmVlw43uTEoaIZBcljHYYN3Acaz5bQ11DrIF4RUS6JiWMdhg3cBx7GvbwXvV7mQ5FRKTDKGG0w9iSsYBufItIdlHCaIfD+h9G97zurPh0RaZDERHpMEoY7ZCXk8ekr0zimX8+k+lQREQ6jBJGO80sncnfN/+dj7Z9lOlQREQ6RLrm9O5rZtPMrH869t8ZnF56OgBPrH0iw5GIiHSMdEzR2gf4C3Ac8IKZ7TPRtpkNN7MnzGypmd0alvUysyfN7Gkze8TMCswsz8w+NrOKcBmT6njba3S/0YzsM1IJQ0SyRjpaGEcDP3H3G4GngPEx6twM/NzdTwQGm1k5cB7BlK2nAhuB6eG+HnD38nB5Kw3xtouZcXrp6Tz/4fPU1tVmOhwRkbRLecJw9xfdfbmZTSFoZSyLUW008Ea4/hnQy93vdPfIXeQBYfkE4Awze83M7jGzlE8puz9mls5kV/0uXqh6IdOhiIikXbruYRhwLrAViNUd+s/AdWZ2JkFL4rmobScCfdx9OfA6cIq7HwfkAzNjHOsyM6s0s8rNmzen/mQSOGnYSfTI78ET7+uylIh0fWlJGB6YDawGvh7j8/nAk8AlwO/dvQaCm+XAHcD3w6qr3X1DuF4JlMbY10J3L3P3sgED9rldklbd87pzyohTeGLtE7h7hx5bRKSjpeOm90/N7ILwbW9gW5yqK4EhwG3hdgXAfwFz3T3yrOp9ZjbWzHKBbwCrUh3v/po5aiYfbf+Itze/nelQRETSKh0tjIXA+Wb2EpALrDOz+THqXUlwk3tn+P5ighvkV4dPRJ0LzAPuI0guy9z92TTEu19mlgZXyf669q8ZjkREJL2sK11KKSsr88rKyo4/7sIydtTtYM0P1pCbk9vhxxcR2R9mtsLdy1qrp57eKTBn8hze/fxdHlzzYKZDERFJGyWMFDj78LM5uuRobnjxBuob6zMdjohIWihhpECO5XBD+Q2s3bKW+1ffn+lwRETSQgkjRc467CzGHzKeeS/N00x8ItIlKWGkiJkxr3we/9z6TxatXJTpcEREUk4JI4Vmls5k4uCJ/MdT/0FFVUWmwxERSSkljBQyM/773P9maO+hzLx/Js/8QxMsiUjXoYSRYgOLB1JxYQWl/Uo584Ez+dNbf9KTUyLSJajjXppU76zmtD+exooNKygpKuG8Medx+ujTObjoYPoV9qOooIiddTvZWbeTXfW7qG+sp76xHnenqKCIngU96d29N0UFRZk+FRHp4pLtuKeEkUZ7GvbwxPtP8IfVf+CJ95+grrHtT0/1K+zHiD4jGNFnBEcMOIKjDj6Kow4+ipF9RqpXuYikhBJGJ1O9s5qVG1dSXVtN9c5qdtbtpEd+D3rk96B7Xnfyc/PJywmm+6jZU8OXu79k666tVG2r4sNtH7K2ei1V26pwgt9XYV4hRww4gjElYzi8/+GM7jea0f1GM6z3MHrk98jkqYrIAUYJowvasWcH73z+Dms+W8Nbm95i9WereWvTW2zasWmvegcXHczQXkMZfNBgDik+hEE9B1FSXEL/Hv3p36M//Qr70bewL30K+1CQW5ChsxGRziLZhNGpZrCTxIoKiigbVEbZoL1/r9t3bWftlrW89/l7VG2r4qPtH1G1rYr3q9+noqqCrbu2xt1nYV4hvbr3ole3XhzU7SCKC4opLiimqKCIHnk9KCooojCvkB75PSjML6Qwr5DC/PB9XiHd87rHXbrldQtec7vp8plIF6CE0QX06t4rZiKJ2FW/i807NvP5zs/ZvHMzW2q3sKV2C9U7q9m+eztf7P6i6XXHnh188sUn1OypobautunG/O6G3fsVY67l0i2vGwW5Bfss3XL3Lo9cnsvPCV/D93k5eeRZi/fhkmu55ObkNm2Xn5u/z/b5OflNdSLb5OXkkZuT27R9juWQa8FrZImURxbDmtfN9iozs4Tr0fVbrid6BZJaj7wXSQcljCzQPa87X+n1Fb7S6yvt3kejNzYlkNr6Wmrraqmtr2V3/W521e+Ku76rfhe7G3azu343uxt2U9dQx56GPexu2M2ehj1N65HyPQ17qK2vpa6hjrrGuqanx+ob66lraH5f11hHQ2ND0/sGb6DRG1P4U+uaOltiSRRPvM9alkcnzrZu27I8UfJteZxE9aLrtHW95T6T3W7GqBncetqtpJMShiQlx3IoKijq1I/5untTMolOOJH1lgmmab2xgQZvoKExSDqN3kiDN+DuTeWOB+XheuQzd2/6rNEb93ofaz3Zz6NfgaTWI++jfx57/XwSfNbqzxbf68ssFdoTa8vyyPtkfgatlUfvL1Gd1vaV1O8sxjFbiynROrBffxAmKy0JI5yb+1jgTXf/PB3HEGnJzIJLUbn5kJ/paES6nnTM6d0H+AtwHPCCmQ2IUWe4mT1hZkvN7Nao8nvMbJmZXZOoTEREOl46hgY5GviJu98IPEUwT3dLNwM/d/cTgcFmVm5mZwO57j4RGGFmpbHK0hCviIgkIeUJw91fdPflZjaFoJWxLEa10cAb4fpnQC+gHHg4LHsamBynbC9mdpmZVZpZ5ebNm1N1GiIi0kJaBh+04Nb9ucBWINZ4GH8GrjOzM4HpwHNAEbA+/HwLUBKnbC/uvtDdy9y9bMCAfa5+iYhIiqQlYXhgNrAa+HqMz+cDTwKXAL939xqgBigMqxSHscUqExGRDEjHTe+fmtkF4dvewLY4VVcCQ4DbwvcraL7kNBaoilMmIiIZkI7HahcCD5vZJcAaYJ2ZzXf3lk85XQnc5u47w/eLgaVmNgiYAUwAPEaZiIhkQKcafDB8JHca8JK7b4xXFk9XH3xQRCQdsnK0WjPbDHy0H7voD2RbR8NsPGfIzvPWOWePtp73UHdv9amhLpUw9peZVSaTZbuSbDxnyM7z1jlnj3Sdt546EhGRpChhiIhIUpQw9rYw0wFkQDaeM2Tneeucs0dazlv3MEREJClqYYiISFKUMEREJClKGGTPnBtm1svMnjSzp83sETMryJZzBzCzEjN7M1zPivM2szvDQT6z4pzNrI+Z/TUcwfq3YVmXPe/w3/TScD3fzB43s1fM7PvxyvZH1ieMLJtz4zyC4VhOBTYC3yV7zh3gFqAwW37nZnYiMNDdH8+WcwbOB+4P+yD0NLOr6KLnHY6C8XuCUb0B/g1Y4e6TgG+bWc84Ze2W9QmDJObc6Crc/U53fyZ8OwD4V7Lk3M1sKrCDIFGW08XP28zygbuAKjM7iyw451A1cJSZ9Qa+Agyn6553A8E0El+E78tpPteXgLI4Ze2mhJHEnBtdjZlNBPoAn5AF525mBcC1wJywKBt+5xcAbwO/JJjIbDZd/5wBXgaGAj8G3gEK6KLn7e5fuPv2qKJ2zSnUFkoYWTbnhpn1Be4Avk/2nPsc4E53jwy1nw3nfQywMByw848Ef1129XMGuA64wt3nAe8C/4PsOG/ogDmFuvIPL1lZM+dG+Jf2fwFz3f0jsufcTwFmm1kFMA44k65/3h8AI8L1MmAYXf+cIWg5jzGzXOB4YAHZcd7QAXMKZX3HPTM7CFhKME3sDGBCi2Zel2FmPwBuAlaFRfcCPyELzj0iTBpfp4v/zsObm78juASRT/CAw2N04XMGMLPjCP5dDwWWAd+i6/+uK9y93MyGAn8FngVOIJg/aHDLMndvaPexsj1hQNvm3OhqsvXcs/G8s/GcIbvOO5xsbjLwVCQxxipr9/6VMEREJBm6hyEiIklRwhARkaQoYYhEMbPbW7wfZ2bjUrj/mPtreVyRzkj3MEQSMLNZAO6+qDPuT6QjKWGIRIk8ohiu/wL4ZvjRenc/2cx6AH8ADgbecvfZke2A14Gj3f00MysG/kzQ0/YDd78o1v7iHLcbsAgYBKwDLgJ+RvB47InAQcB0YDtBv5qDCIbE+I6716f6ZyISoUtSInG4+1yCjl8Lor7cLwPWuPsU4BAzOzosnwAsc/fTwveHEPSoPwUYZmYlcfYXy6XhMU4C1hL0ygcYFR73v4GpwBFAY1h2L0FPXpG0UcIQaZvDgG+GLYoRwKFh+Rp3/++oenXAJcD9QF+ah2dIxhHA38L15cDh4fofwtePCcZIegNYY2ZPA6cBO9t0JiJtpIQhklgt0APAzAx4D7g9vHx0DcGXNwRj9kS7mOCS1PcIRsmNt79Y/k7QYiF8/Xu4vqNFvbHAK+Fw9X0ILleJpI0ShkhizwBnm9krBF/IdwEzzOwl4AqCEX/jbTcXeD58f2hUefT+YrkbODI8RinB/YxYqoAfm9mrwECgMslzEmkX3fQWEZGkqIUhIiJJUcIQEZGkKGGIiEhSlDBERCQpShgiIpIUJQwREUmKEoaIiCTl/wEsmX3wu5G8FAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156972c2ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show(100,rmseList,maeList)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 954,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show(Step,rmseList,maeList):\n",
    "    plt.plot(range(Step), rmseList,label='RMSE-iterations',color='blue')\n",
    "    plt.plot(range(Step), maeList,label='MAE-iterations',color='green')\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.xlabel('iterations')\n",
    "    plt.ylabel('RMSE and MAE')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## BCoNMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 982,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bconmf(y_train_matrix,g_train_matrix,h_train_matrix,o_train_matrix,test_matrix,Step,K,sigma2):\n",
    "    \n",
    "    alpha=0.000001\n",
    "    beta=0.0000001\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    \n",
    "    minrms=100\n",
    "    minmae=100\n",
    "    \n",
    "    I = n_users\n",
    "    J = n_items\n",
    "    \n",
    "    U = np.random.exponential(alpha,(I,K))\n",
    "    V = np.random.exponential(beta,(K,J))\n",
    "    \n",
    "    C = np.random.exponential(beta,(K,J))\n",
    "    E = np.random.exponential(beta,(K,J))\n",
    "    S = np.random.exponential(beta,(K,J))\n",
    "    \n",
    "    Y = y_train_matrix\n",
    "    G = g_train_matrix\n",
    "    H = h_train_matrix\n",
    "    O = o_train_matrix\n",
    "    \n",
    "    \n",
    "    for ste in range(Step): \n",
    "        \n",
    "       \n",
    "        CV = np.dot(V,V.T)\n",
    "        CC = np.dot(C,C.T)\n",
    "        CE = np.dot(E,E.T)\n",
    "        CS = np.dot(S,S.T)\n",
    "        \n",
    "        DY = np.dot(Y,V.T)\n",
    "        DH = np.dot(H,C.T)\n",
    "        DG = np.dot(G,E.T)\n",
    "        DO = np.dot(O,S.T)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if CV[k,k]+CC[k,k]+CE[k,k]+CS[k,k] != 0:\n",
    "                unk = np.concatenate((U[:,:k],U[:,k+1:]),axis=1)\n",
    "                cvnk = np.concatenate((CV[:k,k],CV[k+1:,k]),axis=0)\n",
    "                ccnk = np.concatenate((CC[:k,k],CC[k+1:,k]),axis=0)\n",
    "                cenk = np.concatenate((CE[:k,k],CE[k+1:,k]),axis=0)\n",
    "                csnk = np.concatenate((CS[:k,k],CS[k+1:,k]),axis=0)\n",
    "                an = (DY[:,k] - np.dot(unk,cvnk) + DH[:,k] - np.dot(unk,ccnk)+ DG[:,k] - np.dot(unk,cenk)+ \n",
    "                      DO[:,k] - np.dot(unk,csnk)-alpha*sigma2)/(CV[k,k]+CC[k,k]+CE[k,k]+CS[k,k])\n",
    "                U[:,k] = pnn(an)\n",
    "        \n",
    "        chi = np.square(Y).sum()  + np.square(H).sum() + np.square(G).sum() + np.square(O).sum()\n",
    "        xi = (np.dot(U,V)*(np.dot(U,V)-2*Y)).sum() + (np.dot(U,C)*(np.dot(U,C)-2*H)).sum() +(np.dot(U,E)*(np.dot(U,E)-2*G)).sum() +(np.dot(U,S)*(np.dot(U,S)-2*O)).sum()\n",
    "            \n",
    "        sigma2 =(chi+xi+1)/(2*I*J)\n",
    "            \n",
    "        Eu = np.dot(U.T,U)\n",
    "        \n",
    "        F = np.dot(U.T,Y)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if Eu[k,k] !=0:\n",
    "                unk = np.concatenate((U[:,:k],U[:,k+1:]),axis=1)\n",
    "                vnk = np.concatenate((V[:k,:],V[k+1:,:]),axis=0)\n",
    "                bn = (F[k,:] - np.dot(U[:,k],np.dot(unk,vnk)) -beta*sigma2)/(Eu[k,k])\n",
    "                V[k] = pnn(bn)\n",
    "        \n",
    "        \n",
    "        L = np.dot(U.T,H)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if Eu[k,k] !=0:\n",
    "                cnk = np.concatenate((C[:k,:],C[k+1:,:]),axis=0)\n",
    "                eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "                cn = (L[k,:] - np.dot(eunk,cnk) -beta*sigma2)/(Eu[k,k])\n",
    "                C[k] = pnn(cn)\n",
    "        \n",
    "        \n",
    "        M = np.dot(U.T,G)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if Eu[k,k] !=0:\n",
    "                enk = np.concatenate((E[:k,:],E[k+1:,:]),axis=0)\n",
    "                eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "                en = (M[k,:] - np.dot(eunk,enk) -beta*sigma2)/(Eu[k,k])\n",
    "                E[k] = pnn(en)\n",
    "            \n",
    "        \n",
    "        N = np.dot(U.T,O)\n",
    "        \n",
    "        for k in range(K):\n",
    "            if Eu[k,k] !=0:\n",
    "                snk = np.concatenate((S[:k,:],S[k+1:,:]),axis=0)\n",
    "                eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "                sn = (N[k,:] - np.dot(eunk,snk) -beta*sigma2)/(Eu[k,k])\n",
    "                S[k] = pnn(sn)\n",
    "        \n",
    "           \n",
    "        rms=rmse(np.dot(U,V),test_matrix)\n",
    "        ma=mae(np.dot(U,V),test_matrix)\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "        if minrms>rms:\n",
    "            minrms=rms\n",
    "            best_U = U\n",
    "            best_V = V\n",
    "        if minmae>ma:\n",
    "            minmae=ma\n",
    "            \n",
    "    print(minrms,minmae)\n",
    "        \n",
    "#     show(Step,rmseList,maeList)    \n",
    "           \n",
    "    return best_U,best_V,rmseList,maeList\n",
    "                "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 983,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.019737756267078 3.9043714393956748\n"
     ]
    }
   ],
   "source": [
    "Uy_bconmf,Vy_bconmf,rmseList,maeList = bconmf(y_train_matrix,h_train_matrix,g_train_matrix,o_train_matrix,y_test_matrix,100,10,1.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 986,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEGCAYAAAB2EqL0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8VPW97//XJzcICXI3iJR7sF4QxGwFQUxRFFBra1ttj1vFem3p7tm7j4cWqm6VosVWPfbn79hT1EprrZfds0WtFe9RVKgGBaTesDUqCIjhooEAuXzOH2tNMoSZySTMZELm/Xw81mPWfOe71vqsBOaT71rr+/2auyMiItKanEwHICIiBwYlDBERSYoShoiIJEUJQ0REkqKEISIiSVHCEBGRpChhiIhIUpQwREQkKUoYIiKSlLxMB5BK/fv392HDhmU6DBGRA8qKFSs+d/cBrdXrUglj2LBhVFZWZjoMEZEDipl9lEw9XZISEZGkKGGIiEhSlDBERCQpXeoehoh0jLq6OtatW8euXbsyHYq0Qffu3Rk8eDD5+fnt2l4JQ0TabN26dfTs2ZNhw4ZhZpkOR5Lg7lRXV7Nu3TqGDx/ern3okpSItNmuXbvo16+fksUBxMzo16/ffrUKlTBEpF2ULA48+/s7U8IAPv4Yrr0W/vGPTEciItJ5KWEA27bB/PmwYkWmIxGRZM2aNYtjjjmGiRMn8p3vfIdJkyZx1VVXATBhwgSuv/56NmzYwGmnncYJJ5zAnDlz9tquvLyc8vJyNm7cGPcYK1euZNGiRXuVLV68mG3btqXsPGLtL9ZxOwMlDGDEiOBVLQyRA8sdd9zBsmXLKC4upr6+nlWrVtHY2MiaNWsA+PWvf83FF1/Mq6++ysqVK5uSwx133EFFRQUVFRUMHDgw7v7HjRvHrFmz9irriIQR67idgZ6SAoqLoaRECUOkPf7932HlytTuc9w4uP325Oq6OzU1NRQUFFBfX88HH3zAkCFDADj00EP54x//yOTJk1myZEmb44gkleuvvx6AGTNm8Oabb/Luu+8yadIkbr31Vt5//30uv/xydu7cyezZs7nggguoqKjg0UcfpaqqiiOOOIIbb7yRt956i4svvpj8/HzOO+88fvjDH8bcX6zjfvjhh1xyySXU1tbyzW9+kyuvvJLy8nJOP/10HnnkEfr378+jjz7Ke++9xyWXXEJ9fT2nn3461157bZvPORG1MEKjRsEHH2Q6ChFpi3/7t39j2LBhlJSUkJOTw6BBg3j22Wc59thjAfjRj37EjBkzKC8v56abbtpru/Lycr7zne9QW1vbdHkqsjz22GMxj/fkk08yffp0HnzwwaYv96uuuorrrruOpUuXcvPNN+PuADz88MP86le/4sYbbwRg06ZN/O53v+Oxxx7j3nvvjbu/WK688krmzZvHK6+8wlNPPcU777wDQFFREa+++io1NTVs2LCBJ554grPPPpvly5eTjoFY1cIIjRwJzz+f6ShEDjzJtgTS4Y477uDll1+mW7durFmzhmOOOYZFixbxve99j+3bt7NmzRouvvhiZs2axfTp05k0aVLTdpMnT27aT0VFRbtjeO+997juuuswMxoaGpouL33ve99j1KhRTfXcnauuuor+/ftTX1/fpmO88847HH/88ZgZZWVlvPvuuwBceOGFAAwZMoQ9e/Zw/vnnc9VVVzFt2jTOOuusdp9TPGphhEaOhPXrQR1XRQ4sl19+Offccw8NDQ2MHz+eVatWcdRRRwEwf/58li1bRmFhIaNHj05Jz/TCwkJ27tzZ9P6www5j0aJFVFRU8KMf/YiCggIAiouL99pu3rx53HXXXfzyl7+koaEh7v5iOeKII1i+fDnuzuuvv87hhx8OBC2MaBUVFVx99dUsWbKEX/3qV9TV1e3XubaUtoRhZiVm9mYrny+Nep9vZo+b2Stm9v14ZekyciS4w4cfpvMoIpJqffr0YerUqVRXVzN+/HiOPvropqEvrr32WubOnctJJ51EXV0d06ZNA5ovSZWXl/Piiy+26XgXXHABl156Kccddxy1tbUsWLCASy+9lAkTJvDhhx/u8yUecfbZZzNz5kwuvvhi6urqmpJXy/3F8stf/pL//M//5IQTTmD69Ol89atfjVlvxIgRXHjhhZxwwgnMmDGj3UOAxGOR622pZmb3Af/i7vucmZn1AR4ADnb38WHZT4CD3P16M/srcC5wacsyd/8y3jHLysq8vfNh/O1vMGECPPYYnHlmu3YhkjXeeeedpr9y5cAS63dnZivcvay1bdPSwjCzqcAOIN4Dzg0ECeGLqLJy4OFw/SWgLE5Zy2NdZmaVZla5efPmdsc8cmTwqielRERiS3nCMLMC4FpgTrw6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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15696d0fd68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show(100,rmseList,maeList)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建模地理临近度与属性相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {},
   "outputs": [],
   "source": [
    "place_df=rating_df4[['用户id','id','经度','纬度']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户id</th>\n",
       "      <th>id</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>760565859</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>171630546</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1377035</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>760565859</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>171630546</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1377035</td>\n",
       "      <td>548786</td>\n",
       "      <td>114.372597</td>\n",
       "      <td>30.621815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>14832165</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1217226276</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>36837063</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>8319032</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>7221145</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>14832165</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>1217226276</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>36837063</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>8319032</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>7221145</td>\n",
       "      <td>548818</td>\n",
       "      <td>114.336223</td>\n",
       "      <td>30.658225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>4716199</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>175158946</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>117856260</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>14182654</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>824582928</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>4716199</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>175158946</td>\n",
       "      <td>548835</td>\n",
       "      <td>114.291923</td>\n",
       "      <td>30.604506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>124495907</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>53500198</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>1498451</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>72099856</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>1198468916</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>124495907</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>53500198</td>\n",
       "      <td>548842</td>\n",
       "      <td>114.297598</td>\n",
       "      <td>30.548626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5368</th>\n",
       "      <td>34890948</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5369</th>\n",
       "      <td>387434845</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5370</th>\n",
       "      <td>37231887</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5371</th>\n",
       "      <td>15823359</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5372</th>\n",
       "      <td>116847068</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5373</th>\n",
       "      <td>41414726</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5374</th>\n",
       "      <td>10608558</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5375</th>\n",
       "      <td>181220145</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5376</th>\n",
       "      <td>13733485</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5377</th>\n",
       "      <td>9505450</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5378</th>\n",
       "      <td>4559437</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5379</th>\n",
       "      <td>721327373</td>\n",
       "      <td>97793744</td>\n",
       "      <td>114.208291</td>\n",
       "      <td>30.559631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5380</th>\n",
       "      <td>803676620</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5381</th>\n",
       "      <td>13942718</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5382</th>\n",
       "      <td>18657658</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5383</th>\n",
       "      <td>1247466943</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5384</th>\n",
       "      <td>40097107</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5385</th>\n",
       "      <td>816204181</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5386</th>\n",
       "      <td>98723855</td>\n",
       "      <td>97806541</td>\n",
       "      <td>114.334888</td>\n",
       "      <td>30.558530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5387</th>\n",
       "      <td>97997775</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5388</th>\n",
       "      <td>37231887</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5389</th>\n",
       "      <td>21706307</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5390</th>\n",
       "      <td>97997775</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5391</th>\n",
       "      <td>37231887</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5392</th>\n",
       "      <td>21706307</td>\n",
       "      <td>98237914</td>\n",
       "      <td>114.266967</td>\n",
       "      <td>30.568805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5393</th>\n",
       "      <td>879389133</td>\n",
       "      <td>98447681</td>\n",
       "      <td>114.271174</td>\n",
       "      <td>30.580361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5394</th>\n",
       "      <td>39054415</td>\n",
       "      <td>98447681</td>\n",
       "      <td>114.271174</td>\n",
       "      <td>30.580361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5395</th>\n",
       "      <td>21921249</td>\n",
       "      <td>98447681</td>\n",
       "      <td>114.271174</td>\n",
       "      <td>30.580361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5396</th>\n",
       "      <td>879389133</td>\n",
       "      <td>98447681</td>\n",
       "      <td>114.271174</td>\n",
       "      <td>30.580361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5397</th>\n",
       "      <td>39054415</td>\n",
       "      <td>98447681</td>\n",
       "      <td>114.271174</td>\n",
       "      <td>30.580361</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5398 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            用户id        id          经度         纬度\n",
       "0      760565859    548786  114.372597  30.621815\n",
       "1      171630546    548786  114.372597  30.621815\n",
       "2        1377035    548786  114.372597  30.621815\n",
       "3      760565859    548786  114.372597  30.621815\n",
       "4      171630546    548786  114.372597  30.621815\n",
       "5        1377035    548786  114.372597  30.621815\n",
       "6       14832165    548818  114.336223  30.658225\n",
       "7     1217226276    548818  114.336223  30.658225\n",
       "8       36837063    548818  114.336223  30.658225\n",
       "9        8319032    548818  114.336223  30.658225\n",
       "10       7221145    548818  114.336223  30.658225\n",
       "11      14832165    548818  114.336223  30.658225\n",
       "12    1217226276    548818  114.336223  30.658225\n",
       "13      36837063    548818  114.336223  30.658225\n",
       "14       8319032    548818  114.336223  30.658225\n",
       "15       7221145    548818  114.336223  30.658225\n",
       "16       4716199    548835  114.291923  30.604506\n",
       "17     175158946    548835  114.291923  30.604506\n",
       "18     117856260    548835  114.291923  30.604506\n",
       "19      14182654    548835  114.291923  30.604506\n",
       "20     824582928    548835  114.291923  30.604506\n",
       "21       4716199    548835  114.291923  30.604506\n",
       "22     175158946    548835  114.291923  30.604506\n",
       "23     124495907    548842  114.297598  30.548626\n",
       "24      53500198    548842  114.297598  30.548626\n",
       "25       1498451    548842  114.297598  30.548626\n",
       "26      72099856    548842  114.297598  30.548626\n",
       "27    1198468916    548842  114.297598  30.548626\n",
       "28     124495907    548842  114.297598  30.548626\n",
       "29      53500198    548842  114.297598  30.548626\n",
       "...          ...       ...         ...        ...\n",
       "5368    34890948  97793744  114.208291  30.559631\n",
       "5369   387434845  97793744  114.208291  30.559631\n",
       "5370    37231887  97793744  114.208291  30.559631\n",
       "5371    15823359  97793744  114.208291  30.559631\n",
       "5372   116847068  97793744  114.208291  30.559631\n",
       "5373    41414726  97793744  114.208291  30.559631\n",
       "5374    10608558  97793744  114.208291  30.559631\n",
       "5375   181220145  97793744  114.208291  30.559631\n",
       "5376    13733485  97793744  114.208291  30.559631\n",
       "5377     9505450  97793744  114.208291  30.559631\n",
       "5378     4559437  97793744  114.208291  30.559631\n",
       "5379   721327373  97793744  114.208291  30.559631\n",
       "5380   803676620  97806541  114.334888  30.558530\n",
       "5381    13942718  97806541  114.334888  30.558530\n",
       "5382    18657658  97806541  114.334888  30.558530\n",
       "5383  1247466943  97806541  114.334888  30.558530\n",
       "5384    40097107  97806541  114.334888  30.558530\n",
       "5385   816204181  97806541  114.334888  30.558530\n",
       "5386    98723855  97806541  114.334888  30.558530\n",
       "5387    97997775  98237914  114.266967  30.568805\n",
       "5388    37231887  98237914  114.266967  30.568805\n",
       "5389    21706307  98237914  114.266967  30.568805\n",
       "5390    97997775  98237914  114.266967  30.568805\n",
       "5391    37231887  98237914  114.266967  30.568805\n",
       "5392    21706307  98237914  114.266967  30.568805\n",
       "5393   879389133  98447681  114.271174  30.580361\n",
       "5394    39054415  98447681  114.271174  30.580361\n",
       "5395    21921249  98447681  114.271174  30.580361\n",
       "5396   879389133  98447681  114.271174  30.580361\n",
       "5397    39054415  98447681  114.271174  30.580361\n",
       "\n",
       "[5398 rows x 4 columns]"
      ]
     },
     "execution_count": 252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "place_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {},
   "outputs": [],
   "source": [
    "one_u_places = []\n",
    "one_u_df = place_df[place_df['用户id']==55909586]\n",
    "\n",
    "for p in one_u_df.itertuples(): \n",
    "    lon = p[3]\n",
    "    lat = p[4]\n",
    "    one_u_places.append([lon,lat])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.cluster import KMeans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {},
   "outputs": [],
   "source": [
    "#kmeans 计算每个用户的三个质心\n",
    "users_place_centers=[]\n",
    "for u in users:\n",
    "    u_places =[]\n",
    "    u_df = place_df[place_df['用户id']==u]\n",
    "    for p in u_df.itertuples():\n",
    "        lon = p[3]\n",
    "        lat = p[4]\n",
    "        u_places.append([lon,lat])\n",
    "    \n",
    "    clf = KMeans(n_clusters=3)\n",
    "    clf.fit(u_places)\n",
    "    users_place_centers.append(clf.cluster_centers_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 987,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEHCAYAAABSjBpvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8lOW58PHflWRIIpBAJLJZFhEQZBGNHFBAVgUVtedUXFDA1pMea6Etp1RbFI8gp4hbrQsSBUHAhdpXUKgIKIv2BWmUGlN4wQUSm0IEEiYBsud6/3gmIQlZBjJPZpJc389nPszc89wz9wwPc/Hcy3WLqmKMMcb4IyzYDTDGGNN4WNAwxhjjNwsaxhhj/GZBwxhjjN8saBhjjPGbBQ1jjDF+s6BhjDHGb64FDRGJE5FxItLOrfcwxhjTsFwJGiLSFlgHDAa2iEi8iCwRkR0i8pAf9V8UkYl1lRljjGlYES697gBgpqru9AWQ0UC4qg4VkaUi0lNVv6quoogMBzqo6nu1ldWkXbt22q1bt8B8CmOMaSY+++yzo6oaX9dxrgQNVd0GICIjcK424oDVvqc3AsOAM4KGiHiAl4G/iMjNqrq2urLa3rtbt24kJycH7sMYY0wzICJp/hzn5piGALcB2YACGb6nsoD2NVSbAuwBFgKDRWR6DWVV3ytRRJJFJPnIkSOB/SDGGGPKuRY01HE/kAJcBUT7nmpVy/sOApJU9TCwEhhVQ1nV90pS1QRVTYiPr/PqyhhjzDlyayD8ARGZ4nvYBliA0yUFMBA4WEPVr4GLfPcTgLQayowxxgSBWwPhScBqEbkXSAXWANtFpBMwARgiIn2BO1W14myqJcBSEbkd8AA/AnKqKTsrRUVF/POf/yQ/P79eH8o0TVFRUVx44YV4PJ5gN8WYkCcNtZ+GbxbVOGC7r6vJFQkJCVp1IPzAgQO0bt2a888/H2eoxRiHqnLs2DFyc3Pp3r17sJtjTNCIyGeqmlDXcQ22IlxVs1V1tZsBoyb5+fkWMEy1RITzzz/frkKN8VOzSSNiAcPUxM4NY/zXbIKGCU3FxcXBboIx5ixY0GhAS5cupW/fvowdO5Y+ffpw6aWXMnbsWK644gp++ctfnnH8xx9/zBNPPBGElgbGq6++ym9+8xsOHjxIVlYWixYtYuXKlYAzOQFg4sSJXH311QwaNIixY8dyzTXXlNdfsmQJTz31VPnjN998kzVr1gBw8OBB5s2bd8Z77t69m86dOzNy5Eh+8IMfMHLkSDp06MDIkSNp164dx44dc/MjG9PkWdBoQBEREcycOZPNmzfzi1/8glmzZrF582aeeuqpamfuXHHFFXz11ZnZVoqLi+nSpQsjR45k5MiRfPnllwBcdtll5WWbNm0iPz+fH//4x4waNYpbbrmF7OxsAF5++WUGDRrEHXfcQVFRUY3HjR8/vvz1VqxYAcDcuXMZNmwYQ4YM4cCBA+Vt2rlzJ5MmTSp/nJaWxjPPPMN7773HL37xC15//XWef/55nnnmGfr378+vfvUrAN5//33uuOMOevbsyaZNm9i2bRu7d+9m2bJlhIeH07Jly/LXXLRoER06dKCkpIQuXbrw+eefk5ubC0BpaSkAYWF2ShvjJrem3DZqew952ZCaScbxPDq3iWZ8v/b06Rhb79cVEZ544glWrlzJv/71L8LCwli2bBnHjx9n/PjxAHz33Xdcfvnl9O7du7zesGHOEpfk5GROnjxJSkoKd9xxB48//nj5MceOHeOSSy7hzTffLC978cUX6dWrF0uXLmXRokU8++yzJCYm8sILL/Dpp5/y5ptvsnz5cgoLC8847pFHHkFV2bp1a/nreb1ePvnkEz755BM2btzIU089xfPPP09hYSG//OUvefvttwFnRtLs2bNZvnw533//PQBvvPEGr7zyCvHx8Wzbto2f/OQnAOTm5rJ48WKWLVvGo48+Su/evenYsSMHDhyoNJvp888/Z9++ffTq1YsxY8YQEeGcuj/84Q8BuO6665g1axZxcXFs2LChfJzioYceYvPmzYATWCIjI+v992hMc2ZBo4q9h7wkbT9AbLSHjrFRePOKSNp+gMQR3esdOESEWbNmce+99/LSSy8RFRXFtGnT2Lp1Kxs2bACgRYsWjBkzptKPf5kePXoQHh7Ozp07WbduHVu2bKF///4sXryYTz/9lF27dnHVVVdxwQUXsGLFCvbv38/1118PwAUXXMD+/fvZuXMn1157LZGRkVx33XU88MADtG3b9ozj9u7dyxdffMGwYcOIjIxk5cqVxMXFceTIEbKzs9m9eze9evUC4PHHHycqKoq1a9dyxx13EBcXV94NlZGRwR133MG//du/sWTJEubNm1ceMADGjRtHTEwMr7/+OmlpaTz//PM899xzlQanVbU8IMTFxTFv3jx69OhBp06d2LJlC//617+YPHmy8/e3dy+pqamEhYVx4sQJ0tLSyoNGSUkJkyZNolWrVvX6ezSmObOgUcWG1Exioz3ERjvdRWV/bkjNrHfQ8GfQV0T48MMPy68uKjp82JmtfOWVV7J582Y6duzIlClT+Mtf/kKvXr344IMP6NmzJ3PmzOHVV1/l5ptv5plnnqFFixY8+eSTLFy4kIMHD9K5c2cA4uLiyMzMZNq0aWccFxMTw/vvv8+gQYNYunQpTzzxBE8//TTDhw/nhRde4O9//zvz5s3D6/WSlJTEunXrOHXqFLfccgvbt2/nm2++4fXXX+ett95i2bJlJCQksHbtWoYOHUr//v0ZPnw4v/71r3n66aeJjo7mtttuIzk5me+++47Dhw+zb9++8s/9zTffMHToUHbu3Ak46262bt3Kww8/zDvvvMNVV11Vfuy1117LoUOHeOqpp4iLiyM2NpY1a9aQnp7OmjVr+MEPflCvv0NjmjsLGlVkHM+jY2xUpbLWURFkHM+r92ufPHmSRYsW8eabb5KRkUFYWBgrV64kOzubcePGAXD8+HGuv/56li9ffkb9/v37U1payoABA8q7WRISEvjqq68YP358+bhIQkICmzZtYsaMGXTq1Inly5fTsmVLhg8fztGjR8nIcHJHnjhxgtLSUkaNGnXGcSUlJXTo0KH89d555x22b9/OxRdfzIwZM8jKyuLGG2/kj3/8I1dffTUDBw4EoKCgAK/Xy3/9138xceJExowZw+9+9zvCwsIoLS1l2rRpXHzxxezbt4+wsDB27txJeno6WVlZzJkzh/j4eK6++upKn/viiy/mscceY+zYsQDceuutDBs2jIcffpjk5GQee+yxSsdHRkYycuRI+vbtW172wQcf0KJFi3r/HRrT3FnQqKJzm2i8eUXlVxgAufnFdG4TXUst/+zZs4fFixdz9dVX19g9tXv3bvr3719t/V27dhEWFsbdd9/N7Nmz6devH2vWrOF3v/sds2fPZvjw4dx00028/fbbjBgxAoDevXuTkpLCk08+CTiD60uWLAHgiy++oGzvkarHvfTSS5SUlDBjxgzefvttBg4cSHZ2NqmpqQD89a9/RUTo3r073333HaWlpeTk5JCVlUVMTAybNm3im2++Ye/evdx7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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15697331b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画其中一个用户的地理散点图\n",
    "plt.scatter([x[0] for x in one_u_places],[x[1] for x in one_u_places],label='用户55909586签到位置',alpha=0.5)\n",
    "one_u = int(np.argwhere(users==55909586))\n",
    "plt.scatter(users_place_centers[one_u][0][0],users_place_centers[one_u][0][1],color='red',label='中心1')\n",
    "plt.scatter(users_place_centers[one_u][1][0],users_place_centers[one_u][1][1],color='green',label='中心2')\n",
    "plt.scatter(users_place_centers[one_u][2][0],users_place_centers[one_u][2][1],color='blue',label='中心3')\n",
    "plt.xlabel('经度')\n",
    "plt.ylabel('纬度')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import radians, cos, sin, asin, sqrt  \n",
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {},
   "outputs": [],
   "source": [
    "def haversine(point1,point2):\n",
    "    lat1,lon1,lat2,lon2 = point1[0],point1[1],point2[0],point2[1]\n",
    "    # 将十进制度数转化为弧度\n",
    "    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1,lon2, lat2])\n",
    "   \n",
    "    dlon = lon2 - lon1  \n",
    "    dlat = lat2 - lat1   \n",
    "    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 \n",
    "    c = 2 * asin(sqrt(a)) \n",
    "    r = 6371 # 地球平均半径，单位为公里  \n",
    "    return round(c * r,2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [],
   "source": [
    "res_place_df=rating_df4[['id','经度','纬度','菜系']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    }
   ],
   "source": [
    "res_place_df.drop_duplicates('id','last',inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "metadata": {},
   "outputs": [],
   "source": [
    "res_place_df.index=np.array(range(623))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "metadata": {},
   "outputs": [],
   "source": [
    "items_places=[]\n",
    "for v in items:\n",
    "    v_info = res_place_df[res_place_df['id']==v]\n",
    "    lon = v_info['经度'].values[0]\n",
    "    lat = v_info['纬度'].values[0]\n",
    "    items_places.append([lon,lat])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算地理邻近度pho\n",
    "def pho(i,j):\n",
    "    \n",
    "    point1_1 = users_place_centers[i][0]\n",
    "    point1_2 = users_place_centers[i][1]\n",
    "    point1_3 = users_place_centers[i][2]\n",
    "    point2=items_places[j]\n",
    "    \n",
    "    dij_1 = haversine(point1_1,point2)\n",
    "    dij_2 = haversine(point1_2,point2)\n",
    "    dij_3 = haversine(point1_3,point2)\n",
    "    \n",
    "    if dij_1<dij_2:\n",
    "        dij_1,dij_2=dij_2,dij_1\n",
    "        \n",
    "    if dij_2<dij_3:\n",
    "        dij_2,dij_3=dij_3,dij_2\n",
    "        \n",
    "    pij = (4/(4+dij_3))**math.e\n",
    "\n",
    "    \n",
    "    return pij"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.26832351499934043"
      ]
     },
     "execution_count": 264,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pho(278,622)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "metadata": {},
   "outputs": [],
   "source": [
    "def KLD(p,q):\n",
    "    #p,q=zip(*filter(lambda (x,y): x!=0 or y!=0,zip(p,q)))\n",
    "    return(sum([_p*math.log(_p/_q,2) for (_p,_q) in zip(p,q)]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "metadata": {},
   "outputs": [],
   "source": [
    "def JSD_core(p,q):\n",
    "    p,q=zip(*filter(lambda x:x[0]!=0 or x[1]!=0,zip(p,q)))\n",
    "    M=[(_p+_q)/2 for _p,_q in zip(p,q)]\n",
    "    p=p+np.spacing(1)\n",
    "    q=q+np.spacing(1)\n",
    "    M=M+np.spacing(1)\n",
    "    return KLD(p,M)/2+KLD(q,M)/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 267,
   "metadata": {},
   "outputs": [],
   "source": [
    "xi = np.zeros((n_users,8))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "metadata": {},
   "outputs": [],
   "source": [
    "xj = np.zeros((n_items,8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "metadata": {},
   "outputs": [],
   "source": [
    "#基于价格与时间的共享特征\n",
    "for line in rating_df4.itertuples():\n",
    "    \n",
    "    m = line[7]\n",
    "    t = line[8]\n",
    "    \n",
    "    i = int(np.argwhere(users==line[1]))\n",
    "    \n",
    "    if m>=200:\n",
    "        xi[i,4] += 1\n",
    "    elif m>=100:\n",
    "        xi[i,5] += 1\n",
    "    elif m>=50:\n",
    "        xi[i,6] += 1\n",
    "    elif m>0:\n",
    "        xi[i,7] += 1\n",
    "    else:\n",
    "        pass\n",
    "    \n",
    "    if t>=19 or t==0:\n",
    "        xi[i,3] += 1\n",
    "    elif t>=13:\n",
    "        xi[i,2] += 1\n",
    "    elif t>=7:\n",
    "        xi[i,1] += 1\n",
    "    elif t>=1:\n",
    "        xi[i,0] += 1\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(n_users):\n",
    "    xi[i]=xi[i]/(xi[i].sum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "metadata": {},
   "outputs": [],
   "source": [
    "for line in rating_df4.itertuples():\n",
    "    \n",
    "    m = line[7]\n",
    "    t = line[8]\n",
    "    j = int(np.argwhere(items==line[2]))\n",
    "    \n",
    "    if m>=200:\n",
    "        xj[j,4] += 1\n",
    "    elif m>=100:\n",
    "        xj[j,5] += 1\n",
    "    elif m>=50:\n",
    "        xj[j,6] += 1\n",
    "    elif m>0:\n",
    "        xj[j,7] += 1\n",
    "    else:\n",
    "        pass\n",
    "    \n",
    "    if t>=19 or t==0:\n",
    "        xj[j,3] += 1\n",
    "    elif t>=13:\n",
    "        xj[j,2] += 1\n",
    "    elif t>=7:\n",
    "        xj[j,1] += 1\n",
    "    elif t>=1:\n",
    "        xj[j,0] += 1\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "metadata": {},
   "outputs": [],
   "source": [
    "for j in range(n_items):\n",
    "    xj[j]=xj[j]/(xj[j].sum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "metadata": {},
   "outputs": [],
   "source": [
    "def dlte(i,j):\n",
    "    dlte = 1 - JSD_core(xi[i],xj[j])\n",
    "    return dlte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7396950213572023"
      ]
     },
     "execution_count": 278,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dlte(1,11)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 279,
   "metadata": {},
   "outputs": [],
   "source": [
    "dlte_matrix=np.zeros((n_users,n_items))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "metadata": {},
   "outputs": [],
   "source": [
    "pho_matrix=np.zeros((n_users,n_items))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 281,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(n_users):\n",
    "    for j in range(n_items):\n",
    "        dlte_matrix[i][j]=dlte(i,j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 282,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(n_users):\n",
    "    for j in range(n_items):\n",
    "        pho_matrix[i][j]=pho(i,j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 283,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_df4.to_excel(\"评论数据集2.xlsx\",sheet_name=\"sheet1\",index=False,header=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GC-BCoNMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gcbconmf(y_train_matrix,g_train_matrix,h_train_matrix,o_train_matrix,test_matrix,Step,K,sigma2):\n",
    "    \n",
    "    alpha=0.00001\n",
    "    beta=0.000001\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    \n",
    "    dltepho = dlte_matrix*pho_matrix\n",
    "    minrms=100\n",
    "    minmae=100\n",
    "    \n",
    "    I = n_users\n",
    "    J = n_items\n",
    "    \n",
    "    U = np.random.exponential(alpha,(I,K))\n",
    "    V = np.random.exponential(beta,(K,J))\n",
    "    \n",
    "    C = np.random.exponential(beta,(K,J))\n",
    "    E = np.random.exponential(beta,(K,J))\n",
    "    S = np.random.exponential(beta,(K,J))\n",
    "    \n",
    "    Y = y_train_matrix\n",
    "    G = g_train_matrix\n",
    "    H = h_train_matrix\n",
    "    O = o_train_matrix\n",
    "    \n",
    "    \n",
    "    for ste in range(Step): \n",
    "        \n",
    "        D = np.dot(Y*dltepho,V.T)\n",
    "#         CV = np.dot(V,V.T)\n",
    "        CC = np.dot(C,C.T)\n",
    "        CE = np.dot(E,E.T)\n",
    "        CS = np.dot(S,S.T)\n",
    "        \n",
    "#         DY = np.dot(Y,V.T)\n",
    "        DH = np.dot(H,C.T)\n",
    "        DG = np.dot(G,E.T)\n",
    "        DO = np.dot(O,S.T)\n",
    "        \n",
    "        for k in range(K):\n",
    "            unk = np.concatenate((U[:,:k],U[:,k+1:]),axis=1)\n",
    "            vnk = np.concatenate((V[:k,:],V[k+1:,:]),axis=0)\n",
    "            ccnk = np.concatenate((CC[:k,k],CC[k+1:,k]),axis=0)\n",
    "            cenk = np.concatenate((CE[:k,k],CE[k+1:,k]),axis=0)\n",
    "            csnk = np.concatenate((CS[:k,k],CS[k+1:,k]),axis=0)\n",
    "            an = (D[:,k] - np.dot(np.dot(unk,vnk),V[k])+ DH[:,k] - np.dot(unk,ccnk)+ DG[:,k] - \n",
    "                  np.dot(unk,cenk)+ DO[:,k] - np.dot(unk,csnk)-alpha*sigma2)/(np.dot(dltepho,(V[k]**2).T)+\n",
    "                                                                             CC[k,k]+CE[k,k]+CS[k,k])\n",
    "            U[:,k] = pnn(an)\n",
    "        \n",
    "        chi = np.square(Y).sum()*0.5\n",
    "        xi = (U*(np.dot(np.dot(U,V)*dltepho,V.T)-2*np.dot(Y,V.T))).sum()/2\n",
    "            \n",
    "        sigma2 =(chi+xi+1)/(2*I*J)\n",
    "        \n",
    "        F = np.dot(U.T,Y*dltepho)\n",
    "        \n",
    "        for k in range(K):\n",
    "            unk = np.concatenate((U[:,:k],U[:,k+1:]),axis=1)\n",
    "            vnk = np.concatenate((V[:k,:],V[k+1:,:]),axis=0)\n",
    "            bn = (F[k,:] - np.dot(U[:,k],np.dot(unk,vnk)) -beta*sigma2)/(np.dot(U[:,k]**2,dltepho)+np.spacing(1))\n",
    "            V[k] = pnn(bn)\n",
    "        \n",
    "        \n",
    "        Eu = np.dot(U.T,U)\n",
    "        L = np.dot(U.T,H)\n",
    "        \n",
    "        for k in range(K):\n",
    "            cnk = np.concatenate((C[:k,:],C[k+1:,:]),axis=0)\n",
    "            eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "            cn = (L[k,:] - np.dot(eunk,cnk) -beta*sigma2)/(Eu[k,k]+np.spacing(1))\n",
    "            C[k] = pnn(cn)\n",
    "        \n",
    "        M = np.dot(U.T,G)\n",
    "        \n",
    "        for k in range(K):\n",
    "            enk = np.concatenate((E[:k,:],E[k+1:,:]),axis=0)\n",
    "            eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "            en = (M[k,:] - np.dot(eunk,enk) -beta*sigma2)/(Eu[k,k]+np.spacing(1))\n",
    "            E[k] = pnn(en)\n",
    "        \n",
    "        N = np.dot(U.T,O)\n",
    "        \n",
    "        for k in range(K):\n",
    "            snk = np.concatenate((S[:k,:],S[k+1:,:]),axis=0)\n",
    "            eunk = np.concatenate((Eu[k,:k],Eu[k,k+1:]))\n",
    "            sn = (N[k,:] - np.dot(eunk,snk) -beta*sigma2)/(Eu[k,k]+np.spacing(1))\n",
    "            S[k] = pnn(sn)\n",
    "        \n",
    "           \n",
    "        rms=rmse(np.dot(U,V)*dltepho,test_matrix)\n",
    "        ma=mae(np.dot(U,V)*dltepho,test_matrix)\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "        if minrms>rms:\n",
    "            minrms=rms\n",
    "            best_U = U\n",
    "            best_V = V\n",
    "        if minmae>ma:\n",
    "            minmae=ma\n",
    "            \n",
    "    print(minrms,minmae)\n",
    "        \n",
    "    show(Step,rmseList,maeList)    \n",
    "           \n",
    "    return best_U,best_V,minrms,minmae\n",
    "                "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 289,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.149198705269554 4.069189668449669\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156966ff5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Ugcbco,Vgcbco,y_gcbco_rmse,y_gcbco_mae=gcbconmf(y_train_matrix,g_train_matrix,h_train_matrix,o_train_matrix,y_test_matrix,100,10,1.1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PCoMF 与 GC-PCoNMF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 290,
   "metadata": {},
   "outputs": [],
   "source": [
    "def PcoMF(train_data,test_matrix,eta,K,lambda_1,lambda_2,lambda_3,lambda_4,lambda_5,Step):\n",
    "    # train: train data\n",
    "    # test: test data\n",
    "    # N:the number of user\n",
    "    # M:the number of item\n",
    "    # eta: the learning rata\n",
    "    # K: the number of latent factor\n",
    "    # lambda_1,lambda_2: regularization parameters\n",
    "    # Step: the max iteration\n",
    "    \n",
    "    U = np.random.normal(0,0.1,(n_users,K))\n",
    "    V = np.random.normal(0,0.1,(n_items,K))\n",
    "    C = np.random.normal(0,0.1,(n_items,K))\n",
    "    E = np.random.normal(0,0.1,(n_items,K))\n",
    "    S = np.random.normal(0,0.1,(n_items,K))\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    loss=[]\n",
    "    L=10000\n",
    "    \n",
    "    for ste in range(Step):\n",
    "        los =0.0\n",
    "        for line in train_data.itertuples():\n",
    "            i = int(np.argwhere(users==line[1]))\n",
    "            j = int(np.argwhere(items==line[2]))\n",
    "            \n",
    "            y = line[3]\n",
    "            h = line[4]\n",
    "            g = line[5]\n",
    "            o = line[6]\n",
    "            \n",
    "            ey = y-np.dot(U[i],V[j].T)\n",
    "            eg = g-np.dot(U[i],C[j].T)\n",
    "            eh = h-np.dot(U[i],E[j].T)\n",
    "            eo = o-np.dot(U[i],S[j].T)\n",
    "            \n",
    "            U[i] = U[i] + eta*(ey*V[j]-lambda_1*U[i] + eh*C[j]-lambda_3*U[i] + eg*E[j]-lambda_4*U[i]+eo*S[j]-lambda_5*U[i])\n",
    "            V[j] = V[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j])\n",
    "            C[j] = C[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j])\n",
    "            E[j] = E[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j])\n",
    "            S[j] = S[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j])\n",
    "            \n",
    "\n",
    "            los=los+0.5*(ey**2+lambda_1*np.square(U[i]).sum()+lambda_2*np.square(V[j]).sum())\n",
    "        \n",
    "        loss.append(los)\n",
    "        rms=rmse(np.dot(U,V.T),test_matrix)\n",
    "        ma=mae(np.dot(U,V.T),test_matrix)\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "#         if loss[-1]<L:\n",
    "#             break\n",
    "            \n",
    "    return loss,rmseList,maeList,U,V"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss,y_pcomf_rmseList,y_pcomf_maeList,U,V = PcoMF(train_data,y_test_matrix,0.005,10,0.1,0.1,0.1,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 292,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8085361869443978"
      ]
     },
     "execution_count": 292,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pcomf_rmseList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 293,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.602732522283206"
      ]
     },
     "execution_count": 293,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pcomf_maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 294,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156965364e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='loss-iterations',color='red')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 295,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8VPWd//HXJ/cblyEJJICAVBEIAmIWQaiNrBfQalus2m6rUvHW1fax28dqpepK3eJS27W6tLZFW2mt1drW67ZqvaWighWqKIpY+YlyhwQIEJKQy/f3x5mZDGEmN2YyyZz38/E4j3P7zpnvIZA33+8553vMOYeIiPhXWrIrICIiyaUgEBHxOQWBiIjPKQhERHxOQSAi4nMKAhERn1MQiIj4nIJARMTnFAQiIj6XkewKdEZRUZEbNWpUsqshItKnrF69uso5V9xRuT4RBKNGjWLVqlXJroaISJ9iZh93ppy6hkREfE5BICLicwoCERGf6xPXCESkZzQ2NrJ582bq6+uTXRXpgpycHIYPH05mZma3Pq8gEJGwzZs3069fP0aNGoWZJbs60gnOOaqrq9m8eTPHHntst46hriERCauvr6ewsFAh0IeYGYWFhUfVilMQiMhhFAJ9z9H+zFI6CPbuheuvh6eegt27k10bEZHeKaWD4N134e674fzzobAQJk+G1auTXSsRac+8efM46aSTmD59OhdeeCEzZszghhtuAGDatGksXLiQbdu2cfbZZ3Pqqady4403Hva5iooKKioq2L59e8zveOutt1i2bNlh2x5//HH27t0bt/OIdrxo39sbpHQQzJgBNTVQWQn/9V9QVQUXXuhtE5Hea8mSJaxYsYKCggKamppYs2YNLS0trF27FoC7776b+fPn89prr/HWW2+Ff+kvWbKEyspKKisrKSkpiXn8yZMnM2/evMO29UQQRPve3iDl7xrKzYXPfMabZs2C006Dr38dHnwQ1BUqEtu//Ru89VZ8jzl5Mtx1V+fKOuc4cOAAWVlZNDU18eGHHzJixAgAhg0bxm9+8xtmzpzJM8880+V6hMJi4cKFAMyZM4c333yT999/nxkzZvA///M/fPDBB1x99dUcPHiQa6+9lksvvZTKykqeeOIJNm7cyPjx41m0aBHvvPMO8+fPJzMzk6985Sv867/+a9TjRfvejz76iCuuuIK6ujq+8IUvcP3111NRUcG5557LY489RlFREU888QTr16/niiuuoKmpiXPPPZdbbrmly+fcnpRuEWzet5lp903j2899mz998CfKptSwcCE89BD86lfJrp2IxPKNb3yDUaNGMWTIENLS0hg6dCjPP/88J598MgDXXXcdc+bMoaKigttvv/2wz1VUVHDhhRdSV1cX7iYKTU8++WTU73v66aeZPXs2Dz/8cPiX9g033MCtt97K8uXL+f73v49zDoBHHnmEH/zgByxatAiAHTt28Mtf/pInn3yS+++/P+bxorn++uu57bbbePXVV3n22WdZt24dAPn5+bz22mscOHCAbdu28ac//Ym5c+eycuVKEjEAZ0q3CKoPVpORlsGPVv6IO167g4y0DB74/IN85vmLuO46r+vo+OOTXUuR3qmz/3NPhCVLlvDKK6+QnZ3N2rVrOemkk1i2bBlf/vKXqampYe3atcyfP5958+Yxe/ZsZsyYEf7czJkzw8eprKzsdh3Wr1/PrbfeipnR3Nwc7ub58pe/zHHHHRcu55zjhhtuoKioiKampi59x7p16zjllFMwM8rLy3n//fcBuOyyywAYMWIEhw4d4pJLLuGGG27gzDPP5HOf+1y3zymWlG4RTCqZxCuXv8LeG/fy4qUvMqV0Ctf86Sru+Nkm6urggQeSXUMRieXqq6/mF7/4Bc3NzUyZMoU1a9YwYcIEAL73ve+xYsUKcnNzGTNmTFyehM7NzeXgwYPh9RNOOIFly5ZRWVnJddddR1ZWFgAFBQWHfe62227j3nvv5Y477qC5uTnm8aIZP348K1euxDnHG2+8wbhx4wCvRRCpsrKSm266iWeeeYYf/OAHNDY2HtW5tpXSQRCSl5nH6ceezm/n/pamliYW/G0eY05oiXv/p4jETyAQYNasWVRXVzNlyhQmTpwYHkLhlltuYcGCBXzmM5+hsbGRM888E2jtGqqoqOCvf/1rl77v0ksv5corr2Tq1KnU1dWxePFirrzySqZNm8ZHH310xC/nkLlz53LOOecwf/58Ghsbw6HU9njR3HHHHfznf/4np556KrNnz2bs2LFRy40ePZrLLruMU089lTlz5nR7KIlYLNTv1ZuVl5e7eL2P4L6/38eVT13JSTvvpPr//p2POzVat4g/rFu3Lvy/Uulbov3szGy1c668o8/6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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1569687a5c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), y_pcomf_rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), y_pcomf_maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 914,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gcPcoNMF(train_data,test_matrix,eta,K,lambda_1,lambda_2,lambda_3,lambda_4,lambda_5,Step):\n",
    "    # train: train data\n",
    "    # test: test data\n",
    "    # N:the number of user\n",
    "    # M:the number of item\n",
    "    # eta: the learning rata\n",
    "    # K: the number of latent factor\n",
    "    # lambda_1,lambda_2: regularization parameters\n",
    "    # Step: the max iteration\n",
    "    \n",
    "    U = np.random.normal(0,0.1,(n_users,K))\n",
    "    V = np.random.normal(0,0.1,(n_items,K))\n",
    "    C = np.random.normal(0,0.1,(n_items,K))\n",
    "    E = np.random.normal(0,0.1,(n_items,K))\n",
    "    S = np.random.normal(0,0.1,(n_items,K))\n",
    "    \n",
    "    rmseList=[]\n",
    "    maeList=[]\n",
    "    loss=[]\n",
    "    L=10000\n",
    "    \n",
    "    minrms =100\n",
    "    minmae = 100\n",
    "    \n",
    "    dltepho = (dlte_matrix+pho_matrix)/6\n",
    "    d=0.8\n",
    "    \n",
    "    \n",
    "    for ste in range(Step):\n",
    "        los =0.0\n",
    "        for line in train_data.itertuples():\n",
    "            i = int(np.argwhere(users==line[1]))\n",
    "            j = int(np.argwhere(items==line[2]))\n",
    "            \n",
    "            y = line[3]\n",
    "            h = line[4]\n",
    "            g = line[5]\n",
    "            o = line[6]\n",
    "            \n",
    "            ey = y/(d+dltepho[i,j])-np.dot(U[i],V[j].T)\n",
    "            eg = g-np.dot(U[i],C[j].T)\n",
    "            eh = h-np.dot(U[i],E[j].T)\n",
    "            eo = o-np.dot(U[i],S[j].T)\n",
    "            \n",
    "            U[i] = pnn(U[i] + eta*(ey*V[j]-lambda_1*U[i] + eh*C[j]-lambda_3*U[i] + eg*E[j]-lambda_4*U[i]+eo*S[j]-lambda_5*U[i]))\n",
    "            V[j] = pnn(V[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j]))\n",
    "            C[j] = pnn(C[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j]))\n",
    "            E[j] = pnn(E[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j]))\n",
    "            S[j] = pnn(S[j] + eta*(ey*U[i]-lambda_2*V[j] + eh*U[i]-lambda_3*C[j] + eg*U[i]-lambda_4*E[j]+eo*U[i]-lambda_5*S[j]))\n",
    "            \n",
    "\n",
    "            los=los+0.5*(ey**2+lambda_1*np.square(U[i]).sum()+lambda_2*np.square(V[j]).sum())\n",
    "        \n",
    "        loss.append(los)\n",
    "        rms=rmse(np.dot(U,V.T),test_matrix/(d+dltepho))\n",
    "        ma=mae(np.dot(U,V.T),test_matrix/(d+dltepho))\n",
    "        rmseList.append(rms)\n",
    "        maeList.append(ma)\n",
    "        \n",
    "        if minrms>rms:\n",
    "            minrms=rms\n",
    "            best_U = U\n",
    "            best_V = V\n",
    "        if minmae>ma:\n",
    "            minmae=ma\n",
    "            \n",
    "    print(minrms,minmae)\n",
    "        \n",
    "#     show(Step,rmseList,maeList)  \n",
    "        \n",
    "#         if loss[-1]<L:\n",
    "#             break\n",
    "            \n",
    "    return loss,rmseList,maeList,best_U,best_V"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss,rmseList,maeList,best_U,best_V = gcPcoNMF(train_data,y_test_matrix,0.005,10,0.1,0.1,0.1,0.1,0.1,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 934,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.66667361360292"
      ]
     },
     "execution_count": 934,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rmseList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 935,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4935562080066693"
      ]
     },
     "execution_count": 935,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "maeList[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 932,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15697358860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), rmseList,label='RMSE-iterations',color='blue')\n",
    "plt.plot(range(100), maeList,label='MAE-iterations',color='green')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 933,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15696fee668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(100), loss,label='RMSE-iterations',color='blue')    \n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('iterations')\n",
    "plt.ylabel('RMSE and MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 希尔排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 367,
   "metadata": {},
   "outputs": [],
   "source": [
    "def shellsort(urList,n):\n",
    "    a = urList.resList\n",
    "    index = len(a)\n",
    "    DataLength = index//2\n",
    "    while DataLength != 0:\n",
    "\n",
    "        for j in range(DataLength,index):\n",
    "            Change = False\n",
    "            Temp = a[j]\n",
    "            Pointer = j-DataLength\n",
    "            while Temp['score']>a[Pointer]['score'] and Pointer >= 0 and Pointer <= index:\n",
    "                a[Pointer + DataLength] = a[Pointer]\n",
    "                Pointer = Pointer - DataLength\n",
    "                Change = True\n",
    "                if Pointer < 0 or Pointer > index:\n",
    "                    break\n",
    "        \n",
    "            a[Pointer+DataLength] = Temp\n",
    "        \n",
    "        DataLength = DataLength//2\n",
    "        \n",
    "    b = a[:n]\n",
    "\n",
    "    return b\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 368,
   "metadata": {},
   "outputs": [],
   "source": [
    "resList=[{'resid':132,'score':2.3},{'resid':133,'score':2.1},{'resid':122,'score':2.5},{'resid':232,'score':2.4},]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 369,
   "metadata": {},
   "outputs": [],
   "source": [
    "class UserResList(object):\n",
    "    def __init__(self,userid,resList):\n",
    "        self.userid=userid\n",
    "        self.resList=resList"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 370,
   "metadata": {},
   "outputs": [],
   "source": [
    "urList = UserResList(13213,resList)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 371,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'resid': 122, 'score': 2.5},\n",
       " {'resid': 232, 'score': 2.4},\n",
       " {'resid': 132, 'score': 2.3}]"
      ]
     },
     "execution_count": 371,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shellsort(urList,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 936,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_predict_gcpconmf = np.dot(best_U,best_V.T)*(0.8+(dlte_matrix+pho_matrix)/6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 937,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_predict_gcpconmf[y_train_matrix.nonzero()]=0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取top-n推荐列表与实际列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 800,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_resList(i,matrix):    \n",
    "    userid = users[i]\n",
    "    resList = []\n",
    "    for j in range(n_items):\n",
    "        if matrix[i,j]>=4:\n",
    "            resList.append(items[j])\n",
    "    return resList"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 792,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_recommendList(i,n,matrix):    \n",
    "    userid = users[i]\n",
    "    resList = []\n",
    "    recommendList = []\n",
    "    for j in range(n_items):\n",
    "        resList.append({'resid':items[j],'score':matrix[i,j]})\n",
    "    urList = UserResList(userid,resList)\n",
    "    sorted_urList = shellsort(urList,n)\n",
    "    for res in sorted_urList:\n",
    "        recommendList.append(res['resid'])\n",
    "    return recommendList"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 941,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.08831003679268491\n"
     ]
    }
   ],
   "source": [
    "count = 0\n",
    "f = 0\n",
    "for i in range(n_users):\n",
    "    if len(y_test_matrix[i].nonzero()[0])>=5:\n",
    "        resList = get_resList(i,y_test_matrix)\n",
    "        recommendList = get_recommendList(i,20,y_predict_gcpconmf)\n",
    "        q = len(list(set(resList).intersection(set(recommendList))))\n",
    "        r = q/len(resList)\n",
    "        p = q/len(recommendList)\n",
    "        if p>0 :\n",
    "#             print(p,r)\n",
    "            count +=1\n",
    "            f += (2*p*r)/(p+r+np.spacing(1))\n",
    "f = f/count\n",
    "print(f)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 942,
   "metadata": {},
   "outputs": [],
   "source": [
    "gcpconmf_f_list=[0.181,0.128,0.111,0.093]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 943,
   "metadata": {},
   "outputs": [],
   "source": [
    "pcomf_f_list=[0.167,0.119,0.095,0.077]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 944,
   "metadata": {},
   "outputs": [],
   "source": [
    "nmf_f_list=[0.188,0.141,0.115,0.094]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 945,
   "metadata": {},
   "outputs": [],
   "source": [
    "bnmf_f_list=[0.186,0.141,0.115,0.102]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 946,
   "metadata": {},
   "outputs": [],
   "source": [
    "bconmf_f_list=[0.196,0.143,0.119,0.101]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 947,
   "metadata": {},
   "outputs": [],
   "source": [
    "pmf_f_list=[0.193,0.125,0.093,0.075]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 948,
   "metadata": {},
   "outputs": [],
   "source": [
    "itembasedCF_f_list=[0.189,0.121,0.093,0.076]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 949,
   "metadata": {},
   "outputs": [],
   "source": [
    "userbasedCF_f_list=[0.147,0.130,0.099,0.077]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 950,
   "metadata": {},
   "outputs": [],
   "source": [
    "rmse_list=[0.66,0.81,0.87,4.02,4.03,4.19,4.18]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 951,
   "metadata": {},
   "outputs": [],
   "source": [
    "mae_list=[0.49,0.60,0.72,3.92,3.92,3.91,4.12,4.11]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 952,
   "metadata": {},
   "outputs": [],
   "source": [
    "k=[5,10,15,20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 953,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x156977509b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(k,userbasedCF_f_list,label='userbasedCF')\n",
    "plt.scatter(k,userbasedCF_f_list)\n",
    "plt.plot(k,itembasedCF_f_list,label='itembasedCF')\n",
    "plt.scatter(k,itembasedCF_f_list)\n",
    "plt.plot(k,pmf_f_list,label='PMF')\n",
    "plt.scatter(k,pmf_f_list)\n",
    "plt.plot(k,bconmf_f_list,label='BCoNMF')\n",
    "plt.scatter(k,bconmf_f_list)\n",
    "plt.plot(k,bnmf_f_list,label='BNMF')\n",
    "plt.scatter(k,bnmf_f_list)\n",
    "plt.plot(k,nmf_f_list,label='NMF')\n",
    "plt.scatter(k,nmf_f_list)\n",
    "plt.plot(k,pcomf_f_list,label='PCoNMF')\n",
    "plt.scatter(k,pcomf_f_list)\n",
    "plt.plot(k,gcpconmf_f_list,label='GC-PCoNMF')\n",
    "plt.scatter(k,gcpconmf_f_list)\n",
    "plt.legend(loc='upper right')\n",
    "plt.ylabel('F值')\n",
    "plt.xlabel('推荐列表长度')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
